leetcode
****1111
给定两个字符串 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 * 10^4
s 和 p 仅包含小写字母
thought:根据题目要求,我们需要在字符串 sss 寻找字符串 ppp 的异位词。因为字符串 ppp 的异位词的长度一定与字符串 ppp 的长度相同,所以我们可以在字符串 sss 中构造一个长度为与字符串 ppp 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 ppp 中每种字母的数量相同时,则说明当前窗口为字符串 ppp 的异位词。作者:力扣官方题解
链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/1123971/zhao-dao-zi-fu-chuan-zhong-suo-you-zi-mu-xzin/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {public List<Integer> findAnagrams(String s, String p) {int sLen = s.length(),pLen = p.length();if(sLen<pLen){return new ArrayList<Integer>();}List<Integer> res = new ArrayList<Integer>();int sCount[] = new int[26];int pCount[] = new int[26];for(int i = 0; i<pLen;i++){sCount[s.charAt(i)-'a']++;pCount[p.charAt(i)-'a']++;}if(Arrays.equals(sCount,pCount)){res.add(0);}for(int i = 0;i<sLen-pLen;i++){sCount[s.charAt(i)-'a']--;sCount[s.charAt(i+pLen)-'a']++;if(Arrays.equals(sCount,pCount)){res.add(i+1);}}return res;}
}