#include <vector>
#include <limits>
#include <string>
#include <iostream>
#include <array>
#include <cassert>

class Solution {
  std::array<unsigned short, 256> has;
public:
  int lengthOfLongestSubstring(std::string s) {
    std::fill(has.begin(), has.end(), std::numeric_limits<unsigned short>::max());

    int max = 0, current = 0;
    int i = 0, j = 0;

    while ( i + max < s.length() && j < s.length() ) {
      char c = s[j];
      if ( has[c] == std::numeric_limits<unsigned short>::max() ) {
        has[c] = j++;
        if ( ++current > max ) {
	  max = current;
	}
      } else {
	auto b = has[c] + 1;
	do {
	  has[s[i++]] = std::numeric_limits<unsigned short>::max();
	} while ( i < b );
	// current = j - i + 1;
        has[c] = j++;
	current = j - i;
      }
    }

    return max;
  }
};

int main()
{
  Solution s;
  auto n = s.lengthOfLongestSubstring("aab");
  std::cout << "n = " << n << std::endl;
  assert(n == 2);
  n = s.lengthOfLongestSubstring("pwwkew");
  std::cout << "n = " << n << std::endl;
  assert(n == 3);
  n = s.lengthOfLongestSubstring("tmmzuxt");
  std::cout << "n = " << n << std::endl;
  assert(n == 5);
  n = s.lengthOfLongestSubstring("dvdf");
  std::cout << "n = " << n << std::endl;
  assert(n == 3);
  n = s.lengthOfLongestSubstring("ckilbkd");
  std::cout << "n = " << n << std::endl;
  assert(n == 5);

  return 0;
}
