Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for “abcabcbb” is “abc”, which the length is 3. For “bbbbb” the longest substring is “b”, with the length of 1.
求最大不重复子串。
维护两个指针i,j,分别代表该子串的首字母尾字母下标,j不断向后遍历,如果遇到当前子串中遇到的字符,则将头指针往后移,移到与j指针字符相同的下一位(如”abcdefgdabc”,当j指向第二个d时,则i要指向e字符),记录每个j指针下当前子串的长度,然后取最大值,即为最大不重复子串长度。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i,j;
int ans=0;
bool flag[128]={0};//为什么取128呢,因为测试时会考虑到ASCLL码表中所有可能出现的情况
for(i=0,j=0;j<s.length();j++){
while(flag[(int)s[j]]==1){//当出现当前j指针指的位置之前子串中出现过时
flag[(int)s[i]]=0;
i++;//i指针后移并将该处的flag置为0
}
flag[(int)s[j]]=1;
if(ans<j-i+1)ans=j-i+1;
}
return ans;
}
};
第二种解法(一样思路换种写法):
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i=0;
int j=0;
int ans=0;
bool flag[128]={0};
while(j<s.length()){
if(flag[(int)s[j]]==0){//j指针等于0,表示并没有与之前子串相同的字符
flag[(int)s[j]]=1;
j++;
if(ans<=j-i)ans=j-i;//将j当前位置时与最大长度比较,取其最大值。
continue;
}
flag[(int)s[i]]=0;//表示指针j当前位置字符该字串中存在
i++;//i指针右移,且将该i位置flag置为1
}
return ans;
}
};