有关438题

来源:3-8 在滑动窗口中做记录 Longest Substring Without Repeating Characters

慕仰7036876

2020-11-17

public List<Integer> findAnagrams(String s, String p) {
    char[] pArr = p.toCharArray();
    char[] sArr = s.toCharArray();

    List<Integer> res = new ArrayList();
    int[] needs = new int[26];
    int[] window = new int[26];

    for (int i = 0; i < pArr.length; i++) {
        needs[pArr[i] - 'a']++;
    }

    int l = 0, r = 0;
    while (r < sArr.length) {
        int curR = sArr[r] - 'a';
        r++;
        window[curR]++;
        while (window[curR] > needs[curR]) {
            int curL = sArr[l] - 'a';
            window[curL]--;
            l++;
        }
        if (pArr.length == r - l) {
            res.add(l);
        }
    }
    return res;
}

老师我想问的是438题,我的答案写的是
if(pArr.length == r  - l + 1){
res.add(l);
}

答案不通过,但是改为了r - l就通过了,我想问一下明明目标字符串的值应该等于的是r - l + 1呀。比如目标字符串是3个字符组成的,那么就应该是2 - 0 + 1才对,如果是 r - l的话,那么就变成2 - 0了呀。就是2了,不会等于3。这个地方想了半天想不明白。

写回答

1回答

liuyubobobo

2020-11-17

int curR = sArr[r] - 'a';
r++; // 因为你在这里 r ++  了。


所以你的 r 指向不是 curR 字符的位置了,而是这个位置的后一个位置。


使用一个小的测试用例,实际运行跟踪一下,看看你的程序中 r 到底是谁?再怎么变化?和你想象的逻辑是否一样?如果不一样,哪里不一样?自己哪里想错了?进步就在这个过程中哦。


继续加油!:)

0
2
liuyubobobo
回复
慕仰7036876
把每一个字符映射成为一个整数,'a' 对应 0;'b' 对应 1,以此类推。
2020-11-18
共2条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程