438. Find All Anagrams in a String

你快乐吗

Posted by bbkgl on January 1, 2020

浮生只合尊前老

雪满长安道

C++,哈希,字符串比较。

如何判断连个字符串组成的字符以及数目是相同的呢?

最容易想到的就是,记录下每个字符出现的次数,然后比较每个字符出现的次数是否相等。

所以就是利用hash记录字符出现次数,然后比较两个hash表是否相等。

在本题中,很容易就会想到,遍历字符串s,每前进一位,对新组成的子串,利用hash记录字符出现次数,然后将这个hash表与字符串p对应的hash表进行比较。

但这样每前进一位都要重新计算hash表,显然在效率上是可以提升的。

前进一位的时候,对失去的字符,应该在原hash表上-1,对新增的字符,在原hash表上+1。。。就这么简单。。。

hash容器表用vector,可以直接用==比较是否相同。

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> hash1(26, 0), hash2(26, 0), ans;
        if (s.length() < p.length()) return ans;
        int len = p.length();
        for (const auto &it : p) hash1[it - 'a']++;
        for (int i = 0; i < len; i++) hash2[s[i] - 'a']++;
        if (hash1 == hash2) ans.push_back(0);
        for (int i = 1; i + len - 1 < s.length(); i++) {
            hash2[s[i-1] - 'a']--;
            hash2[s[i + len - 1] - 'a']++;
            if (hash2 == hash1) ans.push_back(i);
        }
        return ans;
    }
};