LeetCode-热题100:438. 找到字符串中所有字母异位词

题目描述

给定两个字符串 sp,找到 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
  • sp 仅包含小写字母

代码及注释

func findAnagrams(s string, p string) []int {
    // 初始化两个数组来存储字符出现的次数
    pCh, sCh := [26]int{}, [26]int{}
    
    // 存储结果的切片
    res := make([]int, 0)
    
    // 统计字符串p中每个字符的出现次数
    for _, ch := range p {
        pCh[ch - 'a']++
    }
    
    // 使用滑动窗口遍历字符串s
    left, right := 0, 0
    for right < len(s) {
        // 更新sCh中当前字符的出现次数
        sCh[s[right] - 'a']++
        right++

        // 当窗口大小等于p的长度时,进行判断
        if right - left == len(p) {
            // 如果两个数组相同,说明找到了一个异位词
            if isSame(sCh, pCh) {
                res = append(res, left)
            }

            // 移动左边界,并更新sCh中对应字符的出现次数
            sCh[s[left] - 'a']--
            left++
        }
    }
    return res
}

// 判断两个数组是否相同
func isSame(sCh, pCh [26]int) bool {
    for i := 0; i < 26; i++ {
        if sCh[i] != pCh[i] {
            return false
        }
    }
    return true
}

代码解释:

  1. 初始化数组

    pCh, sCh := [26]int{}, [26]int{}
    

    用两个长度为26的数组pChsCh来分别记录字符串p和当前滑动窗口中的字符出现的次数。

  2. 初始化结果切片

    res := make([]int, 0)
    

    用于存储找到的异位词的起始索引。

  3. 统计字符出现次数

    for _, ch := range p {
        pCh[ch - 'a']++
    }
    

    遍历字符串p,统计每个字符出现的次数。

  4. 滑动窗口遍历字符串s

    left, right := 0, 0
    for right < len(s) {
        // ...
    }
    

    使用两个指针leftright组成滑动窗口,遍历字符串s

  5. 更新字符出现次数

    sCh[s[right] - 'a']++
    right++
    

    更新滑动窗口中当前字符s[right]的出现次数。

  6. 判断是否找到异位词

    if right - left == len(p) {
        if isSame(sCh, pCh) {
            res = append(res, left)
        }
        sCh[s[left] - 'a']--
        left++
    }
    

    当滑动窗口的大小等于p的长度时,判断当前窗口内的字符出现次数与p的字符出现次数是否相同。如果相同,则将左指针left添加到结果切片中,并移动左指针,并更新对应字符的出现次数。

  7. 判断两个数组是否相同

    func isSame(sCh, pCh [26]int) bool {
        for i := 0; i < 26; i++ {
            if sCh[i] != pCh[i] {
                return false
            }
        }
        return true
    }
    

    该函数用于判断两个数组pChsCh是否相同,即判断当前窗口内的字符出现次数与p的字符出现次数是否相同。

相关推荐

  1. 找到字符串所有字母LeetCode 438)

    2024-03-27 02:14:04       51 阅读
  2. LeetCode 438.找到字符串所有字母

    2024-03-27 02:14:04       38 阅读
  3. Leetcode 438. 找到字符串所有字母

    2024-03-27 02:14:04       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 02:14:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 02:14:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 02:14:04       82 阅读
  4. Python语言-面向对象

    2024-03-27 02:14:04       91 阅读

热门阅读

  1. 实习总结(完)

    2024-03-27 02:14:04       45 阅读
  2. vue3路由懒加载

    2024-03-27 02:14:04       43 阅读
  3. Linux制作yum离线源,解决安装RPM包时循环依赖。

    2024-03-27 02:14:04       41 阅读