题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc",所以其长度为3
初始代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map<char, int> dict;int maxlen = 0;
for(int i = 0; i < s.length(); i++){
int len = 0;
for(int j = i; j < s.length(); j++){
if(dict[s[j]]!=0){
dict.erase(dict.begin(),dict.end());
break;
}
len++;
dict[s[j]]++;
}
if(len > maxlen) maxlen = len;
len = 0;
}
return maxlen;
}
};
提交后显示超时。
改进代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> mp;
int left = 0, right = 0;
int maxlen = 0;
for(right; s[right]; right++){
while(mp[s[right]] != 0 && left != right){//找新无重复字符串的起始位置
mp[s[left]] = 0;
left ++;
}
mp[s[right]] = 1;
maxlen = max(maxlen, right-left+1);
}
return maxlen;
}
};
官方题解使用滑块思想,left和right控制滑块边界,比for循环降低了时间复杂度。