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.
Subscribe to see which companies asked this question
分析:用双指针指示子串,和一个map结构存储字符出现的次数,寻找最大的无重复子串长度。大体是这么个思想,但是速度上的区别还是很大的,一开始写了个O(n2)的代码,被一个超级变态长的字符串超时了,看了标准答案的O(n)解法觉得自己真是太蠢了,如果直接跳到下一个字符接着搜索的话,子串依然有重复,应该从第一个和end指针不相同的地方开始,这样算法的复杂度会是O(n)。
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.size();
if(n<=1) return n;
int p=0;
int q=0;
int ret=0;
int m[256]={0};
while(q<n){
if(m[s[q]]==1){
ret=max(ret,q-p);
while(s[p]!=s[q]){
m[s[p]]=0;
p++;
}
p++;
q++;
}
else{
m[s[q]]=1;
q++;
}
}
ret=max(ret,n-p);
return ret;
}
};