給定兩個字符串?s
?和?p
,找到?s
?中所有?p
?的?異位詞?的子串,返回這些子串的起始索引。不考慮答案輸出的順序。
解法思路:
1.
// 判斷字符相等,其實就是給定一個定長的窗口去滑動查找子串,為了便于判斷將p 與窗口中的子串進行排序,如果相等則是
// 將窗口的左邊界加入
這種解法會有時間復雜度超標的問題嗎,但是這個思路也是一種不錯的解法
2.
本題維護長為n的子串s?的每種字母的出現次數。如果s?的每種字母的出現次數,和p的每種字母的出現次數都相同,那么s?是p的異位詞,把s?左端點下標加入答案。
class Solution {
public:vector<int> findAnagrams(string s, string p) {// // 判斷字符相等,其實就是給定一個定長的窗口去滑動查找子串,為了便于判斷將p 與窗口中的子串進行排序,如果相等則是// // 將窗口的左邊界加入// int dis = p.length();// sort(p.begin(), p.end());// vector<int> result;// if(p.length() < s.length()){// for (int left = 0; left <= s.length() - dis; ++left) {// string sub_str = s.substr(left, dis);// sort(sub_str.begin(), sub_str.end());// if (sub_str == p) {// result.push_back(left);// }// }// }// return result;vector<int> ans;array<int, 26> cnt_p{}; // 統計 p 的每種字母的出現次數array<int, 26> cnt_s{}; // 統計 s 的長為 p.length() 的子串 s' 的每種字母的出現次數for (char c : p) {cnt_p[c - 'a']++;}for (int right = 0; right < s.length(); right++) {cnt_s[s[right] - 'a']++; // 右端點字母進入窗口int left = right - p.length() + 1;if (left < 0) { // 窗口長度不足 p.length()continue;}if (cnt_s == cnt_p) { // s' 和 p 的每種字母的出現次數都相同ans.push_back(left); // s' 左端點下標加入答案}cnt_s[s[left] - 'a']--; // 左端點字母離開窗口}return ans;}};