给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
1.普通版——复杂度O(2n)
采用滑动窗口的方式,用一个大小为256的数组来保存字符串是否出现过,如果没出现过,count++,滑动窗口尾部后移一位;如果出现过,count--,滑动窗口首部后移一位。这样做需要遍历两次。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int count=0;
int max=0;
vector<int> record(256,0);
int j=0;
for(int i=0;i<s.size();){
if(record[s[i]-' ']==0){
record[s[i]-' ']=1;
count++;
i++;
} else {
count-=1;
record[s[j]-' ']=0;
j++;
}
if(count>max) max=count;
}
return max;
}
};
2.优化版——只需要遍历一次数组
同样需要建立一个大小为256的数组,但是数组中不再存字符是否出现过,而是存入字符上一次出现过的位置。这样只需要通过当前字符位置减去最小不重复的位置,就是最长不重复字符串的长度。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> record(256,-1);
int start=-1;
int ans=0;
for(int i=0;i<s.size();++i){
if(record[s[i]]>start){
start=record[s[i]];
}
record[s[i]]=i;
ans=max(ans,i-start);
}
return ans;
}
};