LeetCode3. 无重复字符的最长子串


题目

分析

用滑动窗口,就是双指针来做。设 i 为串的尾指针,符合题目要求的串的左侧指针为 j ,且 i 指针向后移动时,j 指针可能不动或者向右移动。

用哈希表来存 从 j 到 i 部分的每个字符的次数,如果 i + 1 重复的话,那么冲突的一定是 位置  i 和 i + 1 部分冲突,这时 j 需要往前移动,移动

到没有哈希表重复为止。

代码

 1 class Solution {
 2 public:
 3     int lengthOfLongestSubstring(string s) {
 4         unordered_map<char,int>heap;
 5         int res = 0;
 6         for(int i = 0,j = 0;i < s.size();i++){
 7             heap[s[i]]++; //尾指针往后移动,同时更新哈希表
 8             while(heap[s[i]] > 1){  
 9                 //出现重复字符 , 窗口开始滑动,头部指针 j 开始往后移动,直到没有重复为止
10                 heap[s[j]]--;
11                 j++;
12              }
13             res = max(res,i - j + 1);
14         }
15 
16         return res;
17     }
18 };