leetcode438. 找到字符串中所有字母异位词

链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/

题目

给定两个字符串 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 仅包含小写字母

思路

记录两个数组,一个数组记录s中前p.size()个字符串的出现频率(模拟hash表)
另一个数组记录p中每个字符的出现频率
然后进行对比 如果两个数组相等 则说明为异构字符串 加入答案(vector重载了比较运算符)
然后遍历滑动,记录s数组去除滑动窗口前一位置的字符计数,增加后添加位置的字符计数,并与另一数组进行比较

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int ns=s.size(),np=p.size();
        if(np>ns)
            return {};
        vector<int>ans,hash(26),hashjudge(26);
        for(int i =0;i<np;++i){
            hash[p[i]-'a']++;
            hashjudge[s[i]-'a']++;
        }
        if(hashjudge==hash)
            ans.push_back(0);
        for(int i=1;i<ns-np+1;++i){
            hashjudge[s[i-1]-'a']--;
            hashjudge[s[i+np-1]-'a']++;
            if(hashjudge==hash)
                ans.push_back(i);
        }
        return ans;
    }
};
posted @ 2021-10-21 14:35  kitamu  阅读(40)  评论(0)    收藏  举报
Live2D