力扣题目3 无重复字符的最长子串

该博客介绍了如何通过双指针策略解决寻找字符串中不包含重复字符的最长子串长度的问题。作者提出用HashMap来存储字符及其出现次数,当遇到重复字符时,左指针回溯,更新子串长度。这种方法有效地避免了重复字符,并找到最长无重复字符子串。
摘要由CSDN通过智能技术生成

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

示例 1:

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

思路分析:

这个题我的思路是使用双指针去解决。因为不需要重复的数字,所以我们可以先让一个指针走,直到遇到相同字符的字母,这个时候我们停止操作,让另外一个指针开始移动,在移动的同时,需要去除他这个位置的字符,直到不重复位置。

查重的思路

判断重复的办法是创建一个map,key是字符,value是出现的次数,每次遇到一个字符的时候,就去map中查看,如果有,就让其value加一,如果没有就将其添加进去。如果value大于2了,就说明这个字符之前存在过。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存失败,源站可能有防盗链机制,建议将图片保存下来直接上传上传(im34ZiL4XXuM-1645345531378)(数据结构与算法.assets/image-20220220162503365.png)(数据结构与算法.assets/image-20220220162503365.png)]

 class Solution {
    public static int lengthOfLongestSubstring(String s) {
        /**
         * res 用于存储结果
         * hashMap 用来保存每个字面出现的次数
         */
        int res = 0;
        HashMap<Character, Integer> hashMap = new HashMap<>();
        for (int i = 0, j = 0; i < s.length(); i++) {
            //如果这个值在map中存在,那么在原有的基础上加一,否则将其加入。
            if (hashMap.containsKey(s.charAt(i))) {
                Integer number = hashMap.get(s.charAt(i));
                hashMap.replace(s.charAt(i),number + 1);
                //System.out.println(s.charAt(i) + "   " + hashMap.get(s.charAt(i)) + "number" + number);
            } else {
                hashMap.put(s.charAt(i),1);
            }
            //如果发现对应的值大于1的就说明有重复的字符,所以要让左指针往后移,直到没有为止。
            while (hashMap.get(s.charAt(i)) > 1) {
                Integer number = hashMap.get(s.charAt(j));
                hashMap.put(s.charAt(j),number - 1);
                j++;
            }
            res = Math.max(res,i - j + 1);
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值