Typescript-Algorithms
    Preparing search index...

    Variable find_all_anagrams_in_a_stringConst

    find_all_anagrams_in_a_string: (s: string, p: string) => number[] = findAnagrams

    438.找到字符串中所有字母异位词

    给定两个字符串 sp,找到 s 中所有 p字母异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

    字母异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。


    输入: s = "cbaebabacd", p = "abc"
    输出: [0,6]
    解释:

    • 起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
    • 起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。

    输入: s = "abab", p = "ab"
    输出: [0,1,2]
    解释:

    • 起始索引等于 0 的子串是 "ab", 它是 "ab" 的字母异位词。
    • 起始索引等于 1 的子串是 "ba", 它是 "ab" 的字母异位词。
    • 起始索引等于 2 的子串是 "ab", 它是 "ab" 的字母异位词。

    • 1 <= s.length, p.length <= 3 * 10^4
    • sp 仅包含小写字母

    Type declaration

      • (s: string, p: string): number[]
      • Parameters

        • s: string
        • p: string

        Returns number[]

    function findAnagrams(s: string, p: string): number[] {
    const ans: number[] = [];
    const hash = new Array(26).fill(0);
    const k = p.length;
    const code = (c: string) => c.charCodeAt(0) - 'a'.charCodeAt(0);

    // 统计p中每个字符的需求
    for (const c of p) {
    hash[code(c)]--;
    }

    for (let l = 0, r = 0; r < s.length; ++r) {
    // 入
    hash[code(s[r])]++;

    // 出
    if (r - l + 1 > k) {
    hash[code(s[l])]--;
    l++;
    }

    // 记
    if (r - l + 1 === k) {
    if (hash.every(x => x === 0)) {
    ans.push(l);
    }
    }
    }
    return ans;
    }