LeetCode刷题笔记(2):滑动窗口

本文介绍使用滑动窗口技术解决LeetCode中无重复字符最长子串问题的方法。通过设定左右边界及哈希表,算法高效地找出字符串中不含有重复字符的最长子串长度。

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;
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值