#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;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxpbWl0cz4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxjYXNzZXJ0PgoKY2xhc3MgU29sdXRpb24gewogIHN0ZDo6YXJyYXk8dW5zaWduZWQgc2hvcnQsIDI1Nj4gaGFzOwpwdWJsaWM6CiAgaW50IGxlbmd0aE9mTG9uZ2VzdFN1YnN0cmluZyhzdGQ6OnN0cmluZyBzKSB7CiAgICBzdGQ6OmZpbGwoaGFzLmJlZ2luKCksIGhhcy5lbmQoKSwgc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBzaG9ydD46Om1heCgpKTsKCiAgICBpbnQgbWF4ID0gMCwgY3VycmVudCA9IDA7CiAgICBpbnQgaSA9IDAsIGogPSAwOwoKICAgIHdoaWxlICggaSArIG1heCA8IHMubGVuZ3RoKCkgJiYgaiA8IHMubGVuZ3RoKCkgKSB7CiAgICAgIGNoYXIgYyA9IHNbal07CiAgICAgIGlmICggaGFzW2NdID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgc2hvcnQ+OjptYXgoKSApIHsKICAgICAgICBoYXNbY10gPSBqKys7CiAgICAgICAgaWYgKCArK2N1cnJlbnQgPiBtYXggKSB7CgkgIG1heCA9IGN1cnJlbnQ7Cgl9CiAgICAgIH0gZWxzZSB7CglhdXRvIGIgPSBoYXNbY10gKyAxOwoJZG8gewoJICBoYXNbc1tpKytdXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgc2hvcnQ+OjptYXgoKTsKCX0gd2hpbGUgKCBpIDwgYiApOwoJLy8gY3VycmVudCA9IGogLSBpICsgMTsKICAgICAgICBoYXNbY10gPSBqKys7CgljdXJyZW50ID0gaiAtIGk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWF4OwogIH0KfTsKCmludCBtYWluKCkKewogIFNvbHV0aW9uIHM7CiAgYXV0byBuID0gcy5sZW5ndGhPZkxvbmdlc3RTdWJzdHJpbmcoImFhYiIpOwogIHN0ZDo6Y291dCA8PCAibiA9ICIgPDwgbiA8PCBzdGQ6OmVuZGw7CiAgYXNzZXJ0KG4gPT0gMik7CiAgbiA9IHMubGVuZ3RoT2ZMb25nZXN0U3Vic3RyaW5nKCJwd3drZXciKTsKICBzdGQ6OmNvdXQgPDwgIm4gPSAiIDw8IG4gPDwgc3RkOjplbmRsOwogIGFzc2VydChuID09IDMpOwogIG4gPSBzLmxlbmd0aE9mTG9uZ2VzdFN1YnN0cmluZygidG1tenV4dCIpOwogIHN0ZDo6Y291dCA8PCAibiA9ICIgPDwgbiA8PCBzdGQ6OmVuZGw7CiAgYXNzZXJ0KG4gPT0gNSk7CiAgbiA9IHMubGVuZ3RoT2ZMb25nZXN0U3Vic3RyaW5nKCJkdmRmIik7CiAgc3RkOjpjb3V0IDw8ICJuID0gIiA8PCBuIDw8IHN0ZDo6ZW5kbDsKICBhc3NlcnQobiA9PSAzKTsKICBuID0gcy5sZW5ndGhPZkxvbmdlc3RTdWJzdHJpbmcoImNraWxia2QiKTsKICBzdGQ6OmNvdXQgPDwgIm4gPSAiIDw8IG4gPDwgc3RkOjplbmRsOwogIGFzc2VydChuID09IDUpOwoKICByZXR1cm4gMDsKfQo=