力扣3题思路

40 阅读1分钟

力扣3题

  • 思路与解法来自b站左程云

首先我们分析一下题目:

图片.png

那么要找出子串,我们就在这个字符串中弄一个滑动的窗口,让右边界不断移动:

图片.png

刚开始,窗口是这样子的。我们不断向右扩大就是让右指针r++。但是我们扩大的过程中会发现,我们会把重复的字母也弄到窗口中,这该怎么办?

图片.png

此时,我们要想到用一个数组来记住每个字符出现的位置,这个数组的元素初始化为-1,如果它出现过我们就把左边界移动到上次出现的下标+1位置。如果没出现就维持原来的左边界即可。

图片.png

我们每一次调整窗口之后都会得到最新窗口的长度,不断那它与之前的答案比较,更新最大值返回即可。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] p = s.toCharArray();
        int[] last = new int[256];
        Arrays.fill(last, -1);
        int ans = 0;
        for (int l = 0, r = 0; r < p.length ; r++) { 
            l = Math.max(l, last[p[r]] + 1);
            ans = Math.max(ans, r - l + 1);
            last[p[r]] = r;
        }
        return ans;
    }
}