LeetCode刷题笔记(2):滑动窗口
题目:无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
分析
1、给你一个字符串abcdabcc,当然我们想的是通过遍历这个字符串来得到最终答案,但是怎么个遍历法就是个技术活,要以最少的时间完成这个任务才是最优的。
2、现在我们以窗口的思想,窗口的滑动是从左向右的,最初窗口大小只有一个字符,我们设置整型变量left=-1,代表窗口的左边界(字符串从0开始的),设置整型变量result,代表最长子串长度
3、那么窗口的移动是怎么实现的呢?这样,我们把每过一个字符,都把它赋值给哈希表,每个字符对应其下标都被存进了哈希表
4、如果下一个将要被存进来的字符在哈希表内已经存在,并且这个字符的下标大于left,那么第一个无重复子串就出现了,那此时result就可以记录下来子串的长度=i-left,但是要之一一点,这个算法是每个子串都会算一下其长度,因此result需要对比一下,看谁大,就把这个赋值给result
5、把上面的话举例就是,abcd已经存进哈希表,到下一个字符是a,发现哈希表内已经有了,并且第二个a的下标为4大于Left,那left=4,此举动相当于窗口滑动了,记录下result的值,继续下一个子串
贴上代码,这仅仅是个方法
public int LengthOfLongestSubstring(string s) {
int result=0;
int left=-1;
int n=s.Length;
Dictionary<char,int> Dic=new Dictionary<char,int>();
for(int i=0;i<n;i++){
if(Dic.ContainsKey(s[i])&&Dic[s[i]]>left){
left=Dic[s[i]];
}
Dic[s[i]]=i;
result=Math.Max(result,i-left);
}
return result;
}
本文介绍使用滑动窗口技术解决LeetCode中无重复字符最长子串问题的方法。通过设定左右边界及哈希表,算法高效地找出字符串中不含有重复字符的最长子串长度。
596

被折叠的 条评论
为什么被折叠?



