給定兩個字符串 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.首先關鍵在與如何將兩個字符串的比較轉化為兩個字符數組的比較。
2.可以建立兩個長度為26的字符數組,通過比較兩個字符數組中字母出現的頻數便可以得出是否為字母異位詞。
3.遍歷字符數組,將字符裝進滑動窗口中,滿了之后,比較兩個字符數組,如果相等,將第一個加進來的字符索添加進結果中,然后更新滑動窗口。
class Solution {public List<Integer> findAnagrams(String S, String P) {char[] s = S.toCharArray();char[] p = P.toCharArray();int[] tar = new int[26];int[] tmp = new int[26];List<Integer> res = new ArrayList<>();int n = s.length;int m = p.length;for (int i = 0; i < m; i++) {int idp = p[i] - 'a';tar[idp]++; }for (int i = 0; i < n; i++) {int ids = s[i] - 'a'; tmp[ids]++;if (i < m - 1) {continue;}if (Arrays.equals(tar, tmp)) {res.add(i - m + 1);}int out = s[i - m + 1] - 'a';tmp[out]--;}return res;}
}