Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
此题要点在于记录每个字符上一次出现的位置,和当前最长子串的开始位置这两个信息。依次处理每个字符,求以该字符结束可得到的最长子串的长度。如果当前处理的字符(假设为c)上一次出现的位置大于当前最长子串的开始位置,就表明该字符(c)不能继续加入到当前最长子串中(否则就出现了重复),此时应更新当前最长子串的开始位置(改为c上一次出现的位置+1,以排除重复)。同时每处理一个字符都要更新这个字符上一次出现的位置(改为当前位置)。
int lengthOfLongestSubstring(string s) {
int len=s.length();
if(len==0)return 0;
int lastPos[256];
memset(lastPos,-1,sizeof(lastPos));
int startPos=0;
int maxLen=0;
for(int i=0;i<len;i++){
if(lastPos[s[i]]>=startPos){
if(i-startPos>maxLen)maxLen=i-startPos;
startPos=lastPos[s[i]]+1;
}
lastPos[s[i]]=i;
}
if(len-startPos>maxLen)maxLen=len-startPos;
return maxLen;
}