无重复字符的最长子串(力扣算法题)

在这里插入图片描述

public static int lengthOfLongestSubstring(String s) {
        HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
        int leftIndex = 0,max = 0;
        for (int i = 0; i < s.length(); i++) {
            if (hashMap.containsKey(s.charAt(i))  && hashMap.get(s.charAt(i)) >= leftIndex){
                leftIndex = hashMap.get(s.charAt(i)) + 1;
            }
            hashMap.put(s.charAt(i), i);
            max = Math.max(max, i - leftIndex + 1);
        }
        return max;
    }

力扣答案,又学会了一点点

昨天(2020/10/28)看别人讲解的不错,我就自己手敲,然后简单的测了一下没毛病,之后上传到博客了。今天(2020/10/29)凭着记忆和自己的理解打算默写一下来巩固学到的东西。看到自己力扣还没有提交的记录,所以把刚刚敲得上传到力扣,发现测试没通过。被测的数据是这样的:
noname1

对这个测试数据仔细琢磨一番之后发现,当对第二个b进行判断是否存在时,确实做了左窗口的右移,继续对下一个a进行判断是否存在时,对左窗口的进行的操作是左移!这是导致测试不通过的原因。对其进行修改时,我尝试着根据hashmap的value值删掉左窗口的左边的value值,程序好像是没有问题,但是测试还是没有过,说我超时了。。。
noname2

以下是我第一次改进之后,超时的代码;因为存入map的value值是递增的,所以我想到把所有value取出来,再通过for循环,然后根据value值把小于左窗口的键和value删掉。结果超时了。。。

public static int lengthOfLongestSubstring(String s) {
        HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
        Collection<Integer> values = hashMap.values();
        int leftIndex = 0,max = 0;
        for (int i = 0; i < s.length(); i++) {
            if (hashMap.containsKey(s.charAt(i))){
                leftIndex = hashMap.get(s.charAt(i)) + 1;
                for (int i1 = 0; i1 < leftIndex; i1++) {
                    values.remove(i1);
                }
            }
            hashMap.put(s.charAt(i), i);
            max = Math.max(max, i - leftIndex + 1);
        }
        return max;
    }

坚持不懈的我,不想重新看其他人答案的我,在原有答案上又做了其他一些改进,终于通过了力扣的测试数据。请看:

public int lengthOfLongestSubstring(String s) {
        HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
        int leftIndex = 0, max = 0;
        for(int i = 0; i < s.length(); i++){
            if(hashMap.containsKey(s.charAt(i))  && hashMap.get(s.charAt(i)) >=leftIndex){
                leftIndex = hashMap.get(s.charAt(i)) + 1;
            }
            hashMap.put(s.charAt(i),i);
            max = Math.max(max, i - leftIndex + 1);
        }
        return max;
    }

我在原有基础上,在判断新查询的字符是否存在时,追加了一条新的条件。那就是“如果新查询的字符在map中已经存在了,那么就继续判断这个已有的字符是否是在左窗口的右边或者就是左窗口,如果是做和之前同样的处理,否则(即存在的字符出现在左窗口的左边)就按照这个字符不存在进行处理”。但是时间复杂度还是照其他人的差不少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值