输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
int lengthOfLongestSubstring(string s) { int res = 0, left = 0, n = s.size(); unordered_map<int, int> m; for (int i = 0; i < n; ++i) { if (m.count(s[i])) { left = m[s[i]]; } m[s[i]] = i; res = max(res, i - left); } return res; }
解题思路:
使用滑动窗口法, i为右边界, left为左边界的前一个
使用i-left就可以求出长度. 如果字符串为空, i=0, 那么长度就是1; 这也是为什么把left设为-1的原因;
使用hashmap 保存每个数和其下标的映射,
如果s[i]已经出现过了, 那么map[s[i]]就大于零
那么此时有两种情况:
1. 上次出现的位置在left的左边, 既不在left和i的区间内
这种情况下, 需要将当前字符包含在区间内, 然后更新下坐标,进行下次循环
2. 上次出现的位置在left的右边, 即在区间内
此时将left 指针直接移到上次出现该字符的位置, 才能满足不重复的要求.
最后, 每次判断一个字符, 就更新下 i-left和当前最长长度.