1、题目:
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
说明:
- 字母异位词指字母相同,但排列不同的字符串。
- 不考虑答案输出的顺序。
示例 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" 的字母异位词。
2、思路:
解法1:时间复杂度:n^2
保证p中的各个字母个数
在s的子串中
相同:采用counter存子串,for i in s加上判断counter(s子串)== counter(p)也需要时间,故n^2
解法2:滑动窗口:n
counter(s子串)时,每移动一步加入当前字母,删除前一个字母
3、代码:
from collections import Counter class Solution(object): def findAnagrams(self, s, p): """ :type s: str :type p: str :rtype: List[int] """ ''' #超出时间限制 if not s or not p: return [] m = len(s) n = len(p) res = [] for i in range(m): if Counter(s[i:i+n]) == Counter(p): res.append(i) return res ''' #滑动窗口 m = len(s) n = len(p) res = [] sCounter = Counter(s[:n-1]) pCounter = Counter(p) for i in range(n-1,m): sCounter[s[i]] += 1 if sCounter == pCounter: res.append(i-n+1) sCounter[s[i-n+1]] -= 1 if sCounter[s[i-n+1]] == 0: del sCounter[s[i-n+1]] return res