前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >找到字符串中所有字母异位词(LeetCode 438)

找到字符串中所有字母异位词(LeetCode 438)

作者头像
恋喵大鲤鱼
发布2023-12-12 10:07:39
2730
发布2023-12-12 10:07:39
举报
文章被收录于专栏:C/C++基础
文章目录
  • 1.问题描述
  • 2.难度等级
  • 3.热门指数
  • 4.解题思路
    • 方法一:暴力法
    • 方法二:滑动窗口
  • 参考文献

1.问题描述

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

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

示例 1:

代码语言:javascript
复制
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

代码语言:javascript
复制
输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

提示:

  • s 和 p 仅包含小写字母

2.难度等级

Medium。

3.热门指数

★★★★☆

出题公司:阿里、腾讯、字节。

4.解题思路

方法一:暴力法

容易想到的解法是遍历字符串的所有字符,判断每个字符为起点、长度为 len§ 的子串是否是异位词。

如何判断是否是异位词呢?

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

通过定义,我们可以知道如果构成字符串的字母相同,且每个字母出现的次数相同,则为异位词。

关于数据结构的选择,可以使用 map 存储字母及其出现的个数。

时间复杂度: 这种解法的空间复杂度很高 O(len(s)*len(p))

空间复杂度: O(len(p))

注意:这种解法可以通过测试用例,但会超时。

下面以 Golang 为给出实现。

代码语言:javascript
复制
func findAnagrams(s string, p string) []int {
    pmap := make(map[rune]int)
    for _, r := range p {
        pmap[r] += 1
    }
    var positions []int

    for i := 0; i <= len(s) - len(p); {
        smap := make(map[rune]int)
        var jump bool
        for j := i; j - i < len(p); j++ {
            if _, ok := pmap[rune(s[j])]; !ok {
                i = j+1
                jump = true
                break
            }
            smap[rune(s[j])] += 1
        }
        if !jump {
            if maps.Equal(pmap, smap) {
                positions = append(positions, i)
            }
            i++
        }
    }
    return positions
}

方法二:滑动窗口

因为字符串 p 的异位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 s 中构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。

在算法的实现中,我们可以使用数组来存储字符串 p 和滑动窗口中每种字母的数量。

当字符串 s 的长度小于字符串 p 的长度时,字符串 s 中一定不存在字符串 p 的异位词。但是因为字符串 s 中无法构造长度与字符串 p 的长度相同的窗口,所以这种情况需要单独处理。

复杂度分析: O(m+(n−m)×Σ),其中 n 为字符串 s 的长度,m 为字符串 p 的长度,Σ 为所有可能的字符数。我们需要 O(m) 来统计字符串 p 中每种字母的数量;需要 O(m) 来初始化滑动窗口;需要判断 n−m+1 个滑动窗口中每种字母的数量是否与字符串 p 中每种字母的数量相同,每次判断需要 O(Σ)。因为 s 和 p 仅包含小写字母,所以 Σ=26。

空间复杂度: O(Σ)。用于存储字符串 p 和滑动窗口中每种字母的数量。

代码语言:javascript
复制
func findAnagrams(s string, p string) []int {
    if len(s) < len(p) {
        return nil
    }

    var sCount, pCount [26]int
	
	// 初始化字符串 p 中每种字母的数量。
	// 初始化滑动窗口中每种字母的数量。
    for i := 0; i < len(p); i++ {
        sCount[s[i]-'a']++
        pCount[p[i]-'a']++
    }

    var r []int
    for i := 0; i <= len(s) - len(p); i++ {
        if sCount == pCount {
            r = append(r, i)
        }
        // 向右移动滑动窗口,移动一个字母。
        sCount[s[i]-'a']--
        if i+len(p) < len(s) {
            sCount[s[i+len(p)]-'a']++
        }
    }
    return r
}

参考文献

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1.问题描述
  • 2.难度等级
  • 3.热门指数
  • 4.解题思路
    • 方法一:暴力法
      • 方法二:滑动窗口
      • 参考文献
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档