LeeCode 不重复字符的 最长子串

文章目录

题目

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

LeeCode
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max = 0;//最大无重复子串
        int left = 0;//左偏移位置
        HashMap<String,Integer> map=new HashMap<>();
        for(int i =0;i<s.length();i++){
            String str = String.valueOf(s.charAt(i));
            if(map.containsKey(str)){
                left = Math.max(left,map.get(str)+1);//如果存在一样的话,偏移到重复的那一位,重新算
            }
            map.put(str,i);
            max = Math.max(max,i-left+1);//在重复之前会计算最大无重复子串,如果重复之后会重新根据后面的子串去计算
            //比如说abcabcbb,遍历到第二个a的时候,最长子串变成bca,如果是dvvf,遍历到第二个v的时候应该变成vf,
            // left是重复英文的下一个标识,比如说abcabc这个,a重复之后,后面是有效的。
            // 但是像dvvf,v重复之后,由于dv的v是在后面的,所以前面的值都废掉了
        }
        return max;
    }
}

思考

       max是最大的子串,left是如果重复需要移动,重新算,跟i遍历跟偏移的重新计算,如果比max大就替换max,不然的话意味着之前的子串更长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值