1.O(n2) 可优化
int lengthOfLongestSubstring(string s) {
set<char> set;
int maxnum=0;
for(int i=0;i<s.size();i++){
set.clear();
set.insert(s[i]);
maxnum = max(maxnum,1);
for(int j=i+1;j<s.size();j++){
if(set.find(s[j])==set.end()){
set.insert(s[j]);
maxnum = max(maxnum,j-i+1);
}else{
break;
}
}
}
return maxnum;
}
2.O(n) (其实是2n,可优化)
int lengthOfLongestSubstring(string s) {
set<char> set;
int maxnum=0;
int i=0,j=0;
while(i<s.size() && j<s.size()){
if(set.find(s[j]) == set.end()){
set.insert(s[j]);
maxnum = max(maxnum,j-i+1);
j++;
}else{
j=++i;
set.clear();
}
}
return maxnum;
}
3.优化
思路:就像是一个框一样,如果碰到相同的,直接跳到不同的那里
比如,“abcdac” 从第一个位置开始,遇到了第二个a,则i右移跳过重复的a,即i=1+1;接着移动,遇到了第二个c,则i跳过重复的c,即i=3+1
int lengthOfLongestSubstring(string s) {
unordered_map<char,int> map;
int res;
for(int i=0,j=0;j<s.size();j++){
if(map.find(s[j])!=map.end()) i = max(map[s[j]],i);
res = max(res,j-i+1);
map[s[j]] = j+1;
}
return res;
}
网友评论