力扣刷题百天计划 Day2 无重复字符的最长子串

学习目标:

我会持续更新我独特的算法思路,希望能给大家带来不一样的思维拓展!
如果大家感觉有帮助的话,欢迎点赞关注支持哦!
你们的鼓励是我坚持下去的动力!
!!!

力扣题库第三题 官方链接


学习内容:

无重复字符的最长子串

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

示例 1:

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

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

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

输入: s = “”
输出: 0

提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

学习时间:

2022.1.8


学习产出:

在这里插入图片描述
为什么执行用时会这么长?
因为我们使用List集合去帮助我们完成一些方法的实现,可能我们自己去实现会比较节省时间。

解题思路

思路一

扫描二维码关注公众号,回复: 14066428 查看本文章

基地址最长不重复字段法

1.首先我们要理解解题的思路,以一个基地址去判断后面的串是不是符合“不重复字符串”的要求,首先把基地址放到List集合里面(List集合在这里帮我们解决了很多的计算,如果没有List,我们可以自己定义一个函数,来取代List的功能。比如说Add,Count,IndexOf,Clear)
2.然后尝试将基地址后面的字符一个个放入,放入前首先判断List集合里面是否存在这个字符
3.如果存在,那就重复了,直接break,将List里面的字符数量与最大值做比较,如果大于最大值,那就取代它为最大值。如果List集合里面不存在这个字符,那就将其加入,对下一个字符进行判断。
4.这个基地址判断判断完后,我们可以得到以这个基地址开头的最长不重复子串,然后,我们将基地址往后移,然后重复上面的操作。
5.我们可以得到,每个基地址开始的最长不重复子串,然后将他们中的最大值返回就行了

public class Solution {
    
    
    public int LengthOfLongestSubstring(string s) {
    
    
            
        
            int Maxlength=0;
            List<char> temp=new List<char>();  //定义List集合
            for(int i=0;i<s.Length;i++){
    
    
                temp.Clear();
                temp.Add(s[i]);  //基地址加入集合
                //遍历后面的全部字符
                for(int j=i+1;j<s.Length;j++){
    
    
                    if(temp.IndexOf(s[j])==-1){
    
       //如果不存在就放入
                        temp.Add(s[j]);
                    }else{
    
    
                        break;  //如果存在就可以break
                    }
                }
                //遍历完成后将List集合长度与最大值做比较 更新最大值
                if(temp.Count()>Maxlength){
    
    
                 Maxlength=temp.Count();
                }
            }

            return Maxlength;

    }
}

思路二

滑动窗口

1.首先滑动窗口名字听起来好像和题目没有关系,但是我们可以想象存在一个窗口,可以类似于队列
2.首先从索引0开始,往前慢慢打开窗口,也就是一个个加入到队列当中,如果加入的这个元素已经存在于窗口了,就将新的元素放入
3.然后将队列往右移(往右边缩),直到将全部重复的元素移除
4.然后现在队列里面就是无重复的子串了,然后继续放入,重复这个过程
5.这个过程中每一次与MaxLength做作比较,实时更新最大不重复字符串的长度。

图解
在这里插入图片描述

public class Solution {
    
    
    public int LengthOfLongestSubstring(string s) {
    
    
            int Maxlength=0;
            int LeftIndex=0;
            List<char> temp=new List<char>();  //定义List集合
            for(int i=0;i<s.Length;i++){
    
    
                if(temp.IndexOf(s[i])!=-1){
    
       //如果存在
                    LeftIndex= Math.Max( temp.LastIndexOf(s[i])+1,LeftIndex);
                }
                temp.Add(s[i]);  
                //遍历完成后将List集合长度与最大值做比较 更新最大值
                if(temp.Count()-LeftIndex>=Maxlength){
    
    
                    Maxlength=temp.Count()-LeftIndex;
                }
            }

            return Maxlength;

    }
}

作者:荷兰猪小灰灰
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/m0_48781656/article/details/122388112