【转载】滑动窗口算法——无重复字符的最长字串

一、问题描述

 

 

 解法一:

复制代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char,char> Hash;
        int right = -1;
        int length = 0;
        for(int i = 0;i < s.size();i++){
            if(i != 0){    
                Hash.erase(s[i-1]);
            }
            while(right + 1 < s.size() && !Hash.count(s[right + 1])){
                Hash.insert(pair<char,char>(s[right + 1],s[right + 1]));
                right ++;
            }
            
            length = max(length, right - i + 1);
        }
        return length;
    }
};
复制代码

 

二、涉及要点

(一)滑动窗口算法

  1. 我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。

  2. 我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求(包含了 T 中的所有字符)。

  3. 此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同时,每次增加 left,我们都要更新一轮结果。

  4. 重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头

  第 2 步相当于在寻找一个「可行解」,然后第 3 步在优化这个「可行解」,最终找到最优解。左右指针轮流前进,窗口大小增增减减,窗口不断向右滑动。使用滑动窗口时,在每一次循环中,首先移动右指针,将所有与原窗口中元素不同的元素都包含入窗口中,所以用while循环,直到遇到重复元素停止,然后移动左指针,一个个减去窗口中最左边的元素,直到窗口中没有与右指针指向的下一个元素相同的元素。

  这里有一个优化点,可以直接将左指针移到窗口内重复元素的下一个元素,避免了多余的循环,需要知道C++中哈希表怎么根据值找到目标值的键

复制代码
 1 class Solution
 2 {
 3 public:
 4     int lengthOfLongestSubstring(string s)
 5     {
 6         //s[start,end) 前面包含 后面不包含
 7         int start(0), end(0), length(0), result(0);
 8         int sSize = int(s.size());
 9         unordered_map<char, int> hash;
10         while (end < sSize)
11         {
12             char tmpChar = s[end];//记录当前判断的字符
13             //仅当s[start,end) 中存在s[end]时更新start
14             if (hash.find(tmpChar) != hash.end() && hash[tmpChar] >= start)//hash.find(tmpChar) != hash.end()表示哈希表中能找到tmpChar
15             {
16                 start = hash[tmpChar] + 1;
17                 length = end - start;
18             }
19             hash[tmpChar] = end;
20 
21             end++;
22             length++;
23             result = max(result, length);
24         }
25         return result;
26     }
27 };
28 
29 作者:pinku-2
30 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-cshi-xian-/
31 来源:力扣(LeetCode)
32 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

(二)哈希表

哈希集合可以用于判断是否有重复字符的问题

1、哈希表的声明

unordered_map<char,char> Hash;

2、插入

Hash.insert(pair<char,char>(s[right + 1],s[right + 1]));

3、删除指定元素

Hash.erase(s[i-1]);

4、在哈希表中查找对应值的个数,找到返回1,找不到返回0

Hash.count(s[right + 1])

 

posted @     阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示