美文网首页
找到字符串中所有字母异位词

找到字符串中所有字母异位词

作者: xialu | 来源:发表于2021-11-28 23:49 被阅读0次

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string

    题目描述:

    给定两个字符串 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" 的异位词。

    代码实现:
    class Solution {
        public List<Integer> findAnagrams(String s, String p) {
            int n = s.length(), m = p.length();
            List<Integer> res = new ArrayList<>();
            if(n < m) return res;
            int[] pCnt = new int[26];
            int[] sCnt = new int[26];
            for(int i = 0; i < m; i++){
                pCnt[p.charAt(i) - 'a']++;
                sCnt[s.charAt(i) - 'a']++;
            }
            if(Arrays.equals(sCnt, pCnt)){
                res.add(0);
            }
            for(int i = m; i < n; i++){
                sCnt[s.charAt(i - m) - 'a']--;
                sCnt[s.charAt(i) - 'a']++;
                if(Arrays.equals(sCnt, pCnt)){
                    res.add(i - m + 1);
                }
            }
            return res;
        }
    }
    

    相关文章

      网友评论

          本文标题:找到字符串中所有字母异位词

          本文链接:https://www.haomeiwen.com/subject/atdkxrtx.html