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” 的异位词。
提示:
1 <= s.length, p.length <= 3 * 104
s 和 p 仅包含小写字母
思路:
就把数字放进map里面,遇到一次就减去这个字母的频数一次,直到map里面所有数字都是0就代表是字母异味词。
代码:
func findAnagrams(s string, p string) []int {
m := make(map[byte]int,0)
if len(p) >len(s){
return []int{}
}
var res []int
for i:=0;i<len(p);i++{
m[p[i]] ++
}
for i:=0;i<len(p);i++{
m[s[i]]--
}
var check func()bool
check = func()bool{
for _,v := range m{
if v != 0{
return false
}
}
return true
}
if check(){
res = append(res,0)
}
for i:=1;i<=len(s)-len(p);i++{
m[s[i-1]] ++
m[s[i+len(p)-1]]--
if check(){
res = append(res, i)
}
}
return res
}
代码效率:
执行用时:20 ms, 在所有 Go 提交中击败了31.08%的用户
内存消耗:5 MB, 在所有 Go 提交中击败了91.62%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!