leetcode最长不重复子串

本文介绍了一种使用Java编程语言解决求解字符串中最长无重复字符子串长度的方法,利用HashMap数据结构跟踪字符出现的位置,动态调整子串范围以避免重复字符。
摘要由CSDN通过智能技术生成
 /*
        解决思路:1用begin,end表示子串开始和结束的位置
                2用hash表检查重复字符
                3从左向右查看每个字符,如果
                   -没有遇到重复字符的话,调整end
                   -遇到重复的字符的话,调整begin
                   -将当前字符放入hash表中
                4 end-begin+1就是当前字串的长度
     */
    public static int lengthOfLongestSubstring(String s) {
        // 创建一个HashMap用于存储字符及其在字符串中的最新位置
        HashMap<Character, Integer> map = new HashMap<>();
        // 初始化窗口的起始位置
        int begin = 0;
        // 初始化最长子串的长度
        int maxLength = 0;
        // 遍历整个字符串
        for (int end = 0; end < s.length(); end++) {
            // 获取当前字符
            char x = s.charAt(end);
            // 判断当前字符是否已经在窗口中出现过
            if (map.containsKey(x)) {
                // 如果出现过,更新窗口的起始位置为上一次该字符出现的位置的下一个位置
                begin = Math.max(begin,map.get(x) + 1);
                // 更新该字符在窗口中的最新位置
                map.put(x, end);
            } else {
                // 如果没有出现过,将该字符及其位置添加到HashMap中
                map.put(x, end);
            }
            // 更新最长子串的长度,取当前长度和之前的最大长度的较大值
            maxLength = Math.max(maxLength, end - begin + 1);
        }
        // 返回最长子串的长度
        return maxLength;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值