找到字符串中所有字母异位词
Problem: 438. 找到字符串中所有字母异位词
给定两个字符串 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" 的异位词。
思路
其实也类似于双指针, 使用了字母值为下标的双数组进行比较, 如果区间内的所有字母每个类型都不大于目标字母, 并且区间与目标长度相同, 即判定为相同
Code
func findAnagrams(s string, p string) []int {
// 将p保存到数组
result := make([]int, 0)
pArray := [26]int{}
sArray := [26]int{}
for _, v := range p {
pArray[v-'a']++
}
start, end := 0, 0
for end < len(s) {
// 将字母逐个加入数组
sArray[s[end]-'a']++
// 判断当前的空间是否符合p
if sArray[s[end]-'a'] > pArray[s[end]-'a'] {
// 出现了不符合的情况 比如需要1个s 但是现在空间中有两个s
// 减去一个s
for s[start] != s[end] {
sArray[s[start]-'a']--
start++
}
// 直到找到s, 从数组中--
sArray[s[start]-'a']--
start++
}
// 再判断长度
if end-start+1 == len(p) {
// 长度符合 进入字符串相同判断 这个字符串相同判断貌似可以省略?
result = append(result, start)
}
end++
}
return result
}