该题使用的是滑动窗口算法,这样可以大大的缩减时间复杂度。
对本题来说,滑动窗口思想简单的来说就是,其中使用的几个变量i,j,k,tmp,max。
i指向窗口的头部,
j指向窗口的尾部,
k用来遍历窗口的元素,
tmp则用来保存窗口头部移动前的窗口长度,
max则用来保存最大值。
举个例子: s = “bacabc”,当i= 0;j = 1
此时s[i] = b,s[j] = b;s[j+1] = a;
然后把 s[j+1] 与在 s[j+1] 之前的所有元素 (b,a) 相比较,此时不相等,j++,如下图所示
此时i= 0,j = 2; s[j+1] = ‘a’,依次和b,a,c作比较,当有想同的时候
则进入 if语句 此时 k = 1;而 i = 2;然后直接跳出最内存循环,
tmp = j-i+1保存更改之后窗口的长度,j++,如下图所示
依此类推,直到遍历完整个字符串或者窗口尾部之后的字符个数小于窗口的长度即可,当窗口尾部之后的字符个数小于窗口的长度时,此时已经得到最长的不重复的子字符串长度。
C
int lengthOfLongestSubstring(char * s){
int max = 0,tmp = 0;
int i = 0,j = 0;
int len = strlen(s);
if(len == 0){
return max;
}
//滑动窗口思想
for(;j < len && len-i > max;j++ ){
tmp++;//记录窗口的长度
for(int k = i;k <= j;k++){
if(s[k] == s[j+1]){
if(tmp > max)
max = tmp;
i= k+1;
tmp =j-i+1; //记录更改之后窗口的长度,因为此时++,所以需要+1
break;
}
}
}
if(tmp > max)
max = tmp;
return max;
}
C++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int max = 0,tmp = 0;
int i = 0,j = 0;
int len = s.length();
if(len == 0){
return max;
}
//滑动窗口思想
for(;j < len && len-i > max;j++ ){
tmp++;
for(int k = i;k <= j;k++){
if(s[k] == s[j+1]){
if(tmp > max)
max = tmp;
i= k+1;
tmp =j-i+1;
break;
}
}
}
if(tmp > max)
max = tmp;
return max;
}
};
个人理解,如有错误欢迎指出,感谢点赞!