劍指 Offer II 015. 字串中的所有變位詞
阿新 • • 發佈:2022-04-05
給定兩個字串 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 僅包含小寫字母
解析:
維護一個長度為p.length()的滑動視窗即可
也可以雙指標
class Solution { public: vector<int> findAnagrams(string s, string p) { vector<int> vis1(26, 0), vis2(26, 0); int n = s.length(); int m = p.length(); vector<int> ret; if(m > n) return ret;for(int i = 0; i < m; i++) { vis1[p[i] - 'a']++; vis2[s[i] - 'a']++; } if(vis1 == vis2) ret.push_back(0); for(int i = m; i < n; i++) { vis2[s[i - m] - 'a']--; vis2[s[i] - 'a']++; if(vis2 == vis1) ret.push_back(i - m + 1); } return ret; } };