【滑动窗口】438. 找到字符串中所有字母异位词【中等】

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

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

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

示例 1:

输入: s = “cbaebabacd”, p = “abc”
输出: [0,6]
解释:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。

解题思路

  • 1、首先,构建目标字符串 p 的字符频率统计,可以使用一个哈希表来记录每个字符出现的次数。
  • 2、然后,使用一个大小为 p.length() 的滑动窗口在字符串 s 上进行遍历。在每个窗口位置, 记录窗口内字符的频率统计。
  • 3、当窗口内的字符频率统计与目标字符串 p 的字符频率统计相同时, 说明窗口内的字符是 p 的一个异位词(即是由相同个数的不同字符组成)。
  • 4、记录下此时窗口的起始索引,并向右移动窗口。
  • 5、如果窗口内的字符频率统计与目标字符串 p 的字符频率统计不相同,则向右移动窗口直到窗口内的字符频率统计与 p 的字符频率统计相同为止。
  • 6、将找到的异位词的起始索引添加到结果列表中。

具体步骤

  • 1、构建目标字符串 p 的字符频率统计 targetFreqMap。
  • 2、初始化滑动窗口的左右边界 left 和 right,初始都为 0。
  • 3、使用一个哈希表 freqMap 记录滑动窗口内字符的频率统计。
  • 4、在 while 循环中,right 指针向右移动,直到 right 达到字符串 s 的末尾:
    (1)更新窗口内字符的频率统计 freqMap。
    (2)当窗口大小大于等于 p 的长度时,判断 freqMap 是否与 targetFreqMap 相同,如果相同则找到了一个异位词,将 left 添加到结果列表中。
    (3)向右移动 left 指针,并更新 freqMap,直到窗口内的字符频率统计与 p 的字符频率统计相同。
  • 5、返回结果列表。

Java实现

public class AnagramsSubstring {
   

    public static List<Integer> findAnagrams(String s, String p) {
   
        List<Integer> result =

你可能感兴趣的:(算法,算法,数据结构,leetcode)