题目:剑指 Offer 48. 最长不含重复字符的子字符串
描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
原代码##1、用map记录当前字符以及下标值;
2、双指针,如果发现有重复字符,左指针直接跳转到重复值下标+1的位置;
3、特别注意if判断l <= map[s[r]],如果没有这一句,就会出现左指针往前跳的情况。比如abba,b先重复,左指针l先跳到下标2的位置,然后判断a重复了,l就会跳转到第一个a出现的位置 + 1,也就是下标 1 的位置。所以这个判断不能少。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n = s.size();
unordered_map map;
int l = 0, r = 0, ans = 0;
while (r < n) {
if (map.find(s[r]) != map.end() && l <= map[s[r]]) {
l = map[s[r]] + 1;
}
map[s[r]] = r;
ans = max(ans, r - l + 1);
r++;
}
return ans;
}
};



