无重复字符的最长子串

69 阅读1分钟

题目

滑动窗口

public class Main {
    public static void main(String[] args) {

        Main main = new Main();
        main.lengthOfLongestSubstring("abca");
    }

    public int lengthOfLongestSubstring(String s) {

        // s由英文字符, 数字, 符号, 空格组成, 用一个256大小的数组来记录滑动窗口内该字符是否出现过
        boolean [] visited = new boolean[256];
        int left = 0;
        int right = 0;
        int max = 0;
        while (right < s.length()) {
            if (visited[s.charAt(right)]) {
                // 缩小窗口
                visited[s.charAt(left)] = Boolean.FALSE;
                left ++;
            } else {
                // 扩大窗口
                visited[s.charAt(right)] = Boolean.TRUE;
                right ++;
            }
            max = Math.max(right - left, max);
        }
        return max;
    }
}

基本思路

  1. 题目要求是无重复子串, 因此用布尔类型的数组来记录某个字符是否存在过, 根据题目要求, 一个256大小的数组就足够用了, 该数组表示在当前窗口内哪些元素出现过

  2. 用滑动窗口来截取字符串, 如果窗口内新添加的元素出现过, 那么右指针不变, 左指针加1, 缩小窗口, 如果新添加的元素未出现过, 右指针+1, 左指针不同, 记录所有时刻窗口的最大宽度, 即是题目答案