题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
思路一:暴力法
- 套两层循环,查找是否有重复字符时,利用map查找
- 时间复杂度约为 O ( N 2 ) O(N^2) O(N2),容易超时
- 内存开销较大,最坏情况需要存储N个元素的额外空间
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty()){
return 0;
}
map<char,char>storge;
int res=1;
for(int i=0;i<s.size();i++){
for(int offset=0;i+offset<s.size();){
if(storge.find(s.at(i+offset))!=storge.end()){
i++;
offset=0;
storge.clear();
}else{
storge[s.at(i+offset)]=s.at(i+offset);
offset++;
}
if(offset+1>res){
res=offset;
}
}
}
return res;
}
};
思路二:滑动窗口
- 当子串的起始位置递增时,子串的最大长度对应的结束位置是单调递增的。
- 命名两个变量
begin
、end
,当在unordered_set
中没有找到对应字符时,将s.at(end)
字符插入,end
自增,否则将unordered_set
中的s.at(begin)
字符删除,begin
自增,直到end
抵达字符串末尾。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int begin=0,end=0,res=0;
unordered_set<char> sol;
while(end<s.size()){
if(sol.find(s.at(end))!=sol.end()){
sol.erase(s.at(begin));
begin++;
}else{
sol.insert(s.at(end));
end++;
}
res=max(res,end-begin);
}
return res;
}
};