1. 程式人生 > 其它 >劍指 Offer II 015. 字串中的所有變位詞

劍指 Offer II 015. 字串中的所有變位詞

給定兩個字串 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; } };