49.最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

假设字符串中只包含从 a 到 z 的字符。

数据范围:

输入字符串长度 [0,1000]。

样例:

输入:"abcabc"
输出:3

代码:

class Solution {
    public int longestSubstringWithoutDuplication(String s) {
        //使用哈希表记录当前窗口各字符的出现次数
        Map<Character,Integer>mp = new HashMap<>();
        //记录最长无重复字符子串的长度
        int res = 0;
        //滑动窗口:i为窗口右边界,j为窗口左边界
        for(int i = 0,j = 0;i<s.length();i++){
            char c = s.charAt(i);
            //更新当前字符计数(如果不存在则默认为0+1)
            mp.put(c,mp.getOrDefault(c,0)+1);
            //如果当前字符计数>1,说明出现重复
            //需要移动左边界j,直到去除重复字符
            while(mp.get(c)>1){
                char c1 = s.charAt(j);
                //左边界字符的计数减1
                mp.put(c1,mp.getOrDefault(c1,0)-1);
                //左边界右移
                j++;
            }
            //更新最大长度(当前窗口长度i-j+1)
            res = Math.max(res,i-j+1);
        }
        //返回最终结果
        return res;
    }
}
posted @ 2025-05-29 10:15  回忆、少年  阅读(16)  评论(0)    收藏  举报