8.无重复字符的最长子串

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

示例1:

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

示例2:

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

示例3:

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

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

代码:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //mp用来存储子串
        Map<Character,Integer>mp = new HashMap<>();
        //res表示不含重复字符的最长字串的长度
        int res = 0;
        //循环遍历字符串s
        for(int i=0,j=0;i<s.length();i++){
            //c用于记录子串最右端子串
            char c = s.charAt(i);
            //将c存入map,如果map中不存在c,则c的个数记为1,否则c的个数+1
            mp.put(c,mp.getOrDefault(c,0)+1);
            //判断map中c的个数是否大于1,如果大于1,表示当前记录的子串中出现了重复的c
            while(mp.get(c)>1){
                //c1用于记录子串最左端字符
                char c1 = s.charAt(j);
                //将j向右移,同时将s[j]代表的字符的个数-1,直到c的个数小于等于1为止,即不出现重复的c为止(题目要求不重复字符)
                mp.put(c1,mp.getOrDefault(c1,0)-1);
                j++;
            }
            //更新不含重复字符的最长字串的长度
            res = Math.max(res,i-j+1);
        }
        //返回不含重复字符的最长字串的长度
        return res;
    }
}
posted @ 2025-03-14 20:25  回忆、少年  阅读(151)  评论(0)    收藏  举报