美文网首页
3. 无重复字符的最长子串

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

作者: Abeants | 来源:发表于2021-10-27 22:32 被阅读0次

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

    示例 1:

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

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

    输入: s = "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
    请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    示例 4:

    输入: s = ""
    输出: 0

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解题思路及方法

    根据567题滑窗的方法,这道题也用了滑动窗口的方法,不过区别是567题窗口尺寸是不变的,而本题的窗口尺寸是可变的。

    首先外层循环控制滑窗,用一个List来充当窗口,初始窗口尺寸为1,窗口内容为第一个字符,接着进入内层循环,开始对比增加窗口尺寸。从外层循环的下一位开始对比,如果窗口不包含这一位字符,那么就将这个字符存进窗口,窗口尺寸+1,否则结束内层循环,对比大小。

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            if (s.length() == 0) return 0;
            int res = Integer.MIN_VALUE;
    
            for (int i = 0; i < s.length(); i++) {
                // 设置窗口
                List<Character> window = new ArrayList<>();
                window.add(s.charAt(i));
                // 设置窗口尺寸
                int windowSize = 1;
                for (int j = i + 1; j < s.length(); j++) {
                    // 如果下一字符与初始窗口的字符不重复,窗口尺寸+1,否则重新设置窗口尺寸为1,开始下一次滑窗
                    if (window.contains(s.charAt(j))) {
                        break;
                    } else {
                        window.add(s.charAt(j));
                        windowSize++;
                    }
                }
                res = Math.max(res, windowSize);
            }
            
            return res;
        }
    }
    
    

    结果如下:
    太辣鸡了!

    相关文章

      网友评论

          本文标题:3. 无重复字符的最长子串

          本文链接:https://www.haomeiwen.com/subject/qxhmaltx.html