java

  • 力扣继续刷题
    题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

思路:可以从字符串开头进行遍历,因为需要在字符串里找到不重复的最长字符串,因此在遍历的时候,每次遇到一个字符就需要判断这个字符在前面遍历的字符里面有没有出现过,后面还需要将这个字符加入到集合里面去,因此需要使用集合HashMap来进行判断字符有没有出现过
具体代码实现

class Solution {
    public int lengthOfLongestSubstring(String s) {

        //int start = 0;
        //int end = 0;
        HashMap<Character,Integer> hashmap = new HashMap<>();
        int ans = 0;
        int length = s.length();
        for(int start = 0,end = 0;end < length;end++){
            //开始遍历字符串 从当前位置开始 遍历到的每一个字符都需要将其拿出来然后放入               //HashMap
            char c = s.charAt(end);
            if(hashmap.containsKey(c)){
                //char cc = hashmap.get(start);
                //hashmap.put(cc,0);
                start = Math.max(start,hashmap.get(c));
            }
            hashmap.put(c ,end + 1);
            ans = Math.max(ans,end-start+1);
        }
        return ans;                                                                         
    }
}

这段代码里面最难理解的就是

if(hashmap.containsKey(c)){
                //char cc = hashmap.get(start);
                //hashmap.put(cc,0);
                start = Math.max(start,hashmap.get(c));
            }

想表达的意思就是当发现重复的字符的时候,应该怎么进行操作,首先分析,每次遍历一个字符的时候都需要将这个字符添加到哈希表中去,然后在计算长度之前都需要在哈希表里面进行查找是否有当前的字符,如果有当前的字符那么就需要将起始指针也就是start指向重复字符后面一个位置,至于为什么start不一个一个的进行增加,而是直接增加到重复字符的后面一个位置,原因是如果逐个增加的话,仍然会小于第一次start开始的位置,因此选择直接增加到重复字符的后面一个位置

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值