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%的用户