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

滑动窗口

class Solution {
    public int lengthOfLongestSubstring(String s) {

        /**
         * 滑动窗口
         * 哈希表存储字符的个数,如果大于0说明重复了
         */
        int[] count = new int[256];

        int left = 0;
        int right = 0;
        int max = 0;

        while (right < s.length()){

            if (count[s.charAt(right)] == 0){

                count[s.charAt(right)]++;
                right++;
            }
            else {

                /**
                 * 个数大于0说明重复了,left左移一位
                 */
                count[s.charAt(left)]--;
                left++;

                max = Math.max(max, right - left + 1);
            }
        }

        return max;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

可变字符串

class Solution {
    public int lengthOfLongestSubstring(String s) {

        /**
         * 使用可变字符串StringBuilder方便对子串进行增删
         */
        StringBuilder str = new StringBuilder();
        
        int right = 0;
        int max = 0;

        while (right < s.length()){

            /**
             * 不包含这个字符就加上
             * String.valueOf()将字符转换为字符串
             */
            if (str.indexOf(String.valueOf(s.charAt(right))) < 0){

                str.append(s.charAt(right));
                max = Math.max(str.length(), max);
                right++;
            }

            /**
             * 如果出现了重复元素,删除子串的第一个字符再去判断
             */
            else {
                str.deleteCharAt(0);
            }
        }

        return max;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化1——减少排重的次数

class Solution {
    public int lengthOfLongestSubstring(String s) {

        StringBuilder str = new StringBuilder();
        
        int right = 0;
        int max = 0;

        while (right < s.length()){

            int flag = str.indexOf(String.valueOf(s.charAt(right)));

            if (flag < 0){

                str.append(s.charAt(right));
                max = Math.max(str.length(), max);
                right++;
            }

            /**
             * 如果出现了重复元素,用flag记录下重复元素第一次出现的位置,该位置之前的区间都不符合条件了,全部删掉
             */
            else {
                str.delete(0, flag + 1);
            }
        }

        return max;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

posted @ 2021-11-24 22:22  振袖秋枫问红叶  阅读(42)  评论(0)    收藏  举报