基本会出现的字符都是ASCII表上的,那我们定义一个和ASCII表长度一样的数组,下标代表ASCII码,值代表它在数组中出现的位置。之后将其一个个录入排查。
我一开始也想用滑动窗口(其实一开始不知道是这个名字),但觉得就是for for ,然后又想用数组来放走过的字符,觉得这可能更麻烦,就用查表。结果贼慢了。
不过挺好玩的,记录下来,给以后的自己当参考
int lengthOfLongestSubstring(char * s){
//建立一个ASCII一样长度的数组 初始化为0
int ascii[127] = {0};
//sum是最长的,now是现在的所选的长度
int sum = 0,now = 0,i = 0,de;
while(s[i] != 0)
{
//如果这个数字之前有出现过一次
if(ascii[s[i]] != 0)
{
//de 记下现在位置
de = i;
//把之后开始的下标给 i
i = ascii[s[i]];
//将刚才所遇到的字符在表上对应的位置清空。
for(int j = i-1;j < de; j++)
{
ascii[s[j]] = 0;
}
//从新的地方开始记录
ascii[s[i]] = i + 1;
sum = sum < now?now:sum;
now = 1;
}
else
{
//记录下标
ascii[s[i]] = i + 1;
now++;
}
i++;
}
return sum < now ? now:sum;
}