LeetCode刷题笔记_438. 找到字符串中所有字母异位词

文章目录

  • 题目描述
  • 思路
  • 题解
  • 参考资料

题目描述

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

输入: s = “abab”, p = “ab”
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 “ab”, 它是 “ab” 的异位词。
起始索引等于 1 的子串是 “ba”, 它是 “ab” 的异位词。
起始索引等于 2 的子串是 “ab”, 它是 “ab” 的异位词。

思路

一次遍历。
使用一个数组存放当前窗口中各个字母的数量,当与 p 的每个字母数量相等时,就可以将当前下标放入返回列表中。

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new LinkedList();
        int[] q = new int[26];
        for (char ch: p.toCharArray()) {
            q[ch - 'a']++;
        }
        boolean f;
        char[] sc = s.toCharArray();
        for (int i = 0; i < s.length(); i++) {
            f = true;
            q[sc[i] - 'a'] --;
            if (i - p.length() >= 0) {
                q[sc[i - p.length()] - 'a'] ++;
            }
            for (int j = 0; j < 26; j++) {
                if (q[j] != 0) {
                    f = false;
                    break;
                }
            }

            if (f) {
                res.add(i - p.length() + 1);
            }
        }

        return res;
    }
}

LeetCode刷题笔记_438. 找到字符串中所有字母异位词_第1张图片

题解

没我写的好。

不过学到了一个

Arrays.equals()

可以比较两个数组是否相等。

参考资料

https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/

你可能感兴趣的:(算法刷题记录,leetcode,算法,java)