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

 

labuladong 题解思路
难度中等

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

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

 

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

 示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

 

提示:

  • 1 <= s.length, p.length <= 3 * 104
  • s 和 p 仅包含小写字母

 

class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        wanted = collections.defaultdict(int)
        cnt_dict = collections.defaultdict(int)
        for ch in p:
            wanted[ch]+=1

        left = right = valid = 0
        res = []
        n = len(s)
        while right < n:
            cur = s[right]
            if cur in wanted:
                cnt_dict[cur]+=1
                if cnt_dict[cur] == wanted[cur]:
                    valid+=1
            right+=1

            while right-left >= len(p):
                cur2 = s[left]
                if valid == len(wanted):
                    res.append(left)
                if cur2 in wanted and wanted[cur2]==cnt_dict[cur2]:
                    valid-=1
                cnt_dict[cur2]-=1
                left+=1
        return res

 

 

posted @ 2022-08-21 00:29  乐乐章  阅读(14)  评论(0编辑  收藏  举报