【转载】滑动窗口算法——无重复字符的最长字串
一、问题描述
解法一:
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;
}
};
二、涉及要点
(一)滑动窗口算法
-
我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。
-
我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求(包含了 T 中的所有字符)。
-
此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同时,每次增加 left,我们都要更新一轮结果。
-
重复第 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])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~