本题是滑动窗口的一道典型题,关键是要分析出可以使用滑动窗口来求解(左右指针不会回溯)、把握住滑动窗口左边界右移的条件。在本题中,当滑动窗口右边界遇到重复字符时,需要将左边界右移,直到左右边界区间的字串无重复字符。需要额外设置一个 hashmap 来记录每个字符的出现次数。
class Solution { public: int lengthOfLongestSubstring(string s) { int l = 0; //左边界 int r = 0; //右边界 int n = s.length(); unordered_map<char, int> flag; int res = 0; while(r < n) { flag[s[r]]++; //右边界的字符计数 while(flag[s[r]] > 1) flag[s[l++]]--; //滑动窗口范围内有重复字母时,左边界右移直到无重复字符 res = max(res, r - l + 1); //更新结果 ++r; //右边界右移 } return res; } };