题目链接
题目描述
给定两个字符串 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 仅包含小写字母
解题思路
见剑指 Offer II 014. 字符串中的变位词_qbnmm的博客-CSDN博客
代码
Python
def findAnagrams(self, s: str, p: str) -> list[int]:
lens, lenp = len(s), len(p)
ans, cnt = [], [0 for _ in range(26)]
if lens < lenp: return ans
for i in range(lenp):
cnt[ord(p[i]) - ord('a')] -= 1
cnt[ord(s[i]) - ord('a')] += 1
diff = 0
for num in cnt:
if num != 0:
diff += 1
if diff == 0:
ans.append(0)
for i in range(lenp, lens):
x, y = s[i], s[i - lenp] # x进y出
if cnt[ord(x) - ord('a')] == 0:
diff += 1
cnt[ord(x) - ord('a')] += 1
if cnt[ord(x) - ord('a')] == 0:
diff -= 1
if cnt[ord(y) - ord('a')] == 0:
diff += 1
cnt[ord(y) - ord('a')] -= 1
if cnt[ord(y) - ord('a')] == 0:
diff -= 1
if diff == 0:
ans.append(i - lenp + 1)
return ans
Go
func findAnagrams(s string, p string) []int {
lens, lenp := len(s), len(p)
var ans []int
var cnt [26]int
if lens < lenp {
return ans
}
for i, ch := range p {
cnt[ch-'a']--
cnt[s[i]-'a']++
}
diff := 0
for _, c := range cnt {
if c != 0 {
diff++
}
}
if diff == 0 {
ans = append(ans, 0)
}
for i := lenp; i < lens; i++ {
x, y := s[i], s[i-lenp] //x进y出
if cnt[x-'a'] == 0 {
diff++
}
cnt[x-'a']++
if cnt[x-'a'] == 0 {
diff--
}
if cnt[y-'a'] == 0 {
diff++
}
cnt[y-'a']--
if cnt[y-'a'] == 0 {
diff--
}
if diff == 0 {
ans = append(ans, i-lenp+1)
}
}
return ans
}