当前位置: 代码迷 >> 综合 >> 3. 无重复字符的最长子串 滑动窗口
  详细解决方案

3. 无重复字符的最长子串 滑动窗口

热度:99   发布时间:2024-02-27 17:26:10.0

题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

思路

模拟查找最长子串,依次以较左边起点为开始,找子串直到遇见有重复字符,然后依次起点右移,重复步骤。

  • 抽象出一个滑动窗口,子串以左边为起点,右边指针扩展至第一个不重复字符或者最后一个不重复字符,采用hash集合简化窗口内字符的查找
  • 细节处理:左起点右移的元素删除,右指针的边界和元素定义(是否归属子串,决定子串长度的计算式)

解法:滑动窗口,hashset

class Solution {
public:int lengthOfLongestSubstring(string s) {int len = s.length();if (len < 2)return len;int maxLen = 0;int right = 0;                                  //滑动窗口的右指针unordered_set<char> set;for (int i = 0; i < len; ++i) {                 //滑动窗口的左起点if (i != 0)                                 //窗口右移时,删除旧起点的元素set.erase(s[i-1]);while(right < len && !set.count(s[right])) {//向右扩展窗口set.insert(s[right]);++right;}maxLen = max(right-i, maxLen);              //右指针减左起点即长度,用max()}return maxLen;}
};

 

  相关解决方案