3. 无重复字符的最长子串
题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思想:滑动窗口
本题比leetcode76,438,567更简单,只需要简单的更新计数器 window
即可,当 window[c]
值大于 1 时,说明窗口中存在重复字符,不符合条件,就该移动 left
缩小窗口了。
唯一需要注意的是,在哪里更新结果长度len 。要的是最长无重复子串,哪一个阶段可以保证窗口中的字符串是没有重复的呢
这里和之前不一样,要在收缩窗口完成后更新 len,因为窗口收缩的 while 条件是存在重复元素,换句话说也就是收缩完成后一定保证窗口中没有重复。
代码:
class Solution { public: int lengthOfLongestSubstring(string s) { int len = 0; //s可能为空 unordered_map<char,int> window,need; int left=0,right=0; while(right<s.size()){ char c = s[right]; right++; window[c]++; while(window[c]>1){ //当window[c]>1时辨明window内有重复元素,需要移动left char d = s[left]; left++; window[d]--; } len = max(len,right-left); } return len; } };