基本思想就是将串分段进行遍历,变更start的位置

代码1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int m[128] = {0}, len = 0, start = 0;
for(int i = 0; i < s.size(); ++i)
{
++m[s[i]];
while(m[s[i]] == 2) //当出现重复时,不断右移start,直至上次出现s[i]的右边,就为新的子串起点
--m[s[start++]]; //右移的同时,对map中的值依次-1
len = max(len,i - start + 1);
}
return len;
}
};

代码2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> map(128, -1); //int map[128] = {-1}会出错;这只让第一个值为-1,其余的还是为0
int len = 0,start = 0;
for(int i = 0; i < s.size(); i++)
{
if(map[s[i]] >= start) //此时还未进行本轮赋值,如果大于start,表示s[i]已经赋值过,在本段中出现过
start = map[s[i]] + 1; //map[s[i]]记录上次出现本字符的位置,+1更新start为新的子串起始位置
map[s[i]] = i;
len = max(len,i - start + 1);
}
return len;
}

};