原题:
438. Find All Anagrams in a String
解题:
两个步骤
1)就是从s中逐步截取p长度的字符串
2)将截取出的字符串和p进行比较,比较可以用排序,或者字典比较(这两种方法提交后都超时了)
代码如下(提交超时):
class Solution { public: vector<int> findAnagrams(string s, string p) { int lenp = p.length(); int lens = s.length(); int i=0,j,flag; vector <int> result; map <char,int> mapstr; map <char,int> maptemp; for(j =0; j < lenp;j++) { mapstr[p[j]]++; } while(i < lens) { maptemp = mapstr; flag = true; for(j = i; j < i +lenp;j++) { if(--maptemp[s[j]] < 0) { flag = false; break; } } if(flag) { result.push_back(i); } i++; } return result; } };
提交AC:
class Solution { public: vector<int> findAnagrams(string s, string p) { if (s.empty()) return {}; vector<int> res, m(256, 0); int left = 0, right = 0, cnt = p.size(), n = s.size(); for (char c : p) ++m[c]; while (right < n) { if (m[s[right++]]-- >= 1) --cnt; if (cnt == 0) res.push_back(left); if (right - left == p.size() && m[s[left++]]++ >= 0) ++cnt; } return res; } };