3.无重复字符的最长字串

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

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


方法一:暴力法

  • 双层循环遍历每一个字符串判断是否重复
  • 如果不重复且比目前最大长度大则更新最大长度
  • 如果重复就退出当前内层循环
public static int lengthOfLongestSubstring(String s){
    int maxLen=0;
    for (int i = 0; i < s.length(); i++) {
        HashSet<Character> set=new HashSet<>();
        for (int j = i; j < s.length(); j++) {
            char c=s.charAt(j);
            if (set.contains(c)){
                break;
            }
        set.add(c);
        maxLen=Math.max(maxLen,j-i+1);
        }
    }
    return maxLen;
}

方法二:滑动窗口

  • 用 left和right记录当前窗口的左右边界
  • 右边界向前移动 右边界所对应的元素是否在当前窗口内
    -- 不在当前窗口内 则右边界向前
    -- 在当前窗口 则左边界向前移动 直至窗口内没有右边界所对应的元素
    -- 记录下当前窗口长度 和最大窗口长度作比较
//滑动窗口
public static int lengthOfLongestSubstring(String s){
    int maxLen=0;
    char[] chars=s.toCharArray();
    HashSet set=new HashSet<>();
    for (int left = 0,right=0; right < chars.length; right++) {
        while(set.contains(chars[right])){
            set.remove(chars[left]);
            left++;
        }
        set.add(chars[right]);
        maxLen= Math.max(maxLen,right-left+1);
    }
    return maxLen;
}
posted @ 2025-03-12 11:38  乘除法  阅读(35)  评论(0)    收藏  举报