题意描述:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
利用滑动窗口,双指针方法
注意:
虽然题中给的用例均为字母,但是
所以s也有可能存在其他的字符。
第一次错误的代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size() == 0){
return 0;
}
vector<int> res(26, 0);
int left = 0;
int right = 0;
int maxLen = 0;
while(right < s.size()){
if(res[s[right] - 'a'] == 0){
res[s[right] - 'a']++;
right++;
}
else{
res[s[left] - 'a']--;
left++;
}
maxLen = max(maxLen, right - left);
}
return maxLen;
}
};
错误在于没考虑到数字、符号以及空格,使用元素的ASCII码相减储存在数组进行判断。
正确思路:利用map
完整C++代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size() == 0) return 0;
unordered_map<int, int> mp;
int maxLen = 0;
int left = 0;
int right = 0;
while(right < s.size()){
if(mp[s[right]] == 0){
mp[s[right]]++;
right++;
}
else{
mp[s[left]]--;
left++;
}
maxLen = max(maxLen, right - left);
}
return maxLen;
}
};