题目描述
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
1 2 3 4 5
   | 输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
 
  | 
 
解题思路
- 数组差+滑窗,用两个数组分别表示字符串p中字母出现的次数以及滑窗中字母出现的次数,方便统计,采用变量diff表示两个数组的不同字母数。diff为0时,将left指针加入结果集中
 
执行用时:8 ms, 在所有 Java 提交中击败了67.39%的用户
内存消耗:42.7 MB, 在所有 Java 提交中击败了38.45%的用户
通过测试用例:64 / 64
时间 O(N)
空间 O(N)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   | class Solution {     public List<Integer> findAnagrams(String s, String p) {         int []ptmp=new int [26];         int []stmp=new int [26];         int left=0,right=0,n=s.length();         int plen=p.length();         int diff=plen;         List<Integer> ans=new ArrayList();         for(int i=0;i<plen;i++){             ptmp[p.charAt(i)-'a']++;         }         while(right<n){             if(right-left+1>plen){                 if(stmp[s.charAt(left)-'a']<=ptmp[s.charAt(left)-'a']){                     diff++;                 }                 else{                     diff--;                 }                 stmp[s.charAt(left)-'a']--;                 left++;             }             else{                 if(stmp[s.charAt(right)-'a']>=ptmp[s.charAt(right)-'a']){                     diff++;                 }                 else{                     diff--;                 }                 stmp[s.charAt(right)-'a']++;                 right++;             }             if(diff==0){                 ans.add(left);             }         }         return ans;     } }
 
  |