题目描述:

给定两个字符串 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等长的哈希数组当作两个窗口,ansS窗口做滑动窗口,在循环中通过减去前面保存的字母数记录,添加后面出现的字母数,再对比和ansP这个固定窗口,是否在同窗口大小下字母出现次数一样得到答案。

我的代码:

class Solution {
        public List<Integer> findAnagrams(String s, String p) {

            int sL = s.length();
            int pL = p.length();
            if(sL<pL){
                return new ArrayList<Integer>();
            }

            int[] ansP = new int[26];
            int[] ansS = new int[26];
            ArrayList<Integer> list = new ArrayList<>();

            for (int i = 0; i < pL; i++) {
                ansP[p.charAt(i)-'a']++;
                ansS[s.charAt(i)-'a']++;
            }

            if(Arrays.equals(ansP,ansS)){
                list.add(0);
            }

            for (int i = pL; i < sL; i++) {

                ansS[s.charAt(i-pL)-'a']--;
                ansS[s.charAt(i)-'a']++;

                if(Arrays.equals(ansS,ansP)){
                    list.add(i-pL+1);
                }

            }

            return list;

        }
    }

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐