浮生只合尊前老
雪满长安道
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;
}
};