LEETCODE试题 3. 无重复字符的最长子串

记录我的刷题历程

LEETCODE试题 3. 无重复字符的最长子串

问题描述

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

示例 1:

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

示例 2:

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

示例 3:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

(错误)思路与大致想法

刚开始的思路是,尽量以O(n)时间复杂度解决,遍历一遍,使用map存储不重复的字符
1.当map重复时
更新开始指针为重复值的位置,更新map中重复值的下标,更新结束指针为开始指针的下一个
1-1.与上一次最大值比较
如果当前值大于最大值则进行更新
2.当map不重复
map插入当前值和当前值的位置

借鉴后的思路

可以发现,题解与我的原有思路出入较大,但是本质上都是想利用递归来解决。
1.遍历一遍,初始化开始下标,结束下标,最大值,map
2.如果结束指针对应的字符与map中的字符重复,则更新开始下标的位置为:当前开始下标与map中重复字符位置的最大值(保证开始下标不左移)
3.是否重复都需要保存最大值,保证map中的字符位置是重复字符的下一位

借鉴后的疑问

1.为什么重复后需要更新的开始指针是map中重复指针的下一位而不是当前end+1,
提问原因:因为end+1就是当前重复的下一位了
实际原因:map.get(),取的是之前重复的字符的下一位,也就是前一个不重复区间新起始位,而不是当前重复指针的下一位,对map.get()存储的值的含义还不够充分理解
2.为什么需要比较当前start与重复指针下一位的位置大小
如果使用end+1作为每一次start,那么就不需要判断最大值,因为end在递增,每次取的开始值肯定比map中的要大
实际原因:与上一问题一样,取的是前区间的下一位,作为新区间的起始位,需要比较当前区间的起始与前区间的起始大小,来保证区间不会左移,例如abba,当遇到第二个a时,start=1,end还在3,取得最大值为3,显然不是我们所需要的结果,因为map.get()不一定会比start大,当字符串中出现连续多个重复字符时,start会增加,而map.get的位置不是固定的

正确代码

    public int lengthOfLongestSubstring(String s) {
        if(s.isEmpty()) return 0;
        int max=0;
        int start=0;
        int end=0;
        Map<Character,Integer> map=new HashMap<>();
        int length=s.length();
        while(end<length){
            char c=s.charAt(end);
            if(null!=map.get(c)){
                //保证start不左移
              start=Math.max(map.get(c),start);
            }
            max=Math.max(end-start+1,max);
            map.put(c,end+1);
            end++;
        }
        return max;
    }

成功截图在这里插入图片描述

思考

1.采用记录重复值下一位的方式,可以保证map中记录的是不重复值的区间
2.采用start=Math.max(map.get©,start);的方式更新开始指针,可以规避原始思路中可能会遗漏的一些不重复字符,导致问题解答错误,保证每次开始之前记录的最大值为无重复子串的长度。取当前start与上一不重复子串的后一位作对比,可以保证start不会左移,一直处于递增状态

借鉴来源

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-jie-suan-fa-3-wu-zhong-fu-zi-fu-de-zui-chang-z/

更多

第一次写博客,思路也许不太清晰,仅作为个人记录学习使用,如果各位大佬们有意见和建议也可以在评论区加以指导。一起进步一起学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值