Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • 每日算法

    • 信
    • 独一无二的出现次数
    • 按奇偶排序数组Ⅱ
    • 两数之和
    • 两数相加2
    • 寻找两个正序数组的中位数
    • 二叉树最大深度
    • 洗牌算法
    • 移动零
    • 数组元素排列组合
    • 上升下降字符
    • 最大间距
    • 四数相加2
    • 最大三角周长
    • 在排序数组中查找元素的起始位置
    • 最富有客户的资产总量
    • 打印规定循环字符串
    • 从m个数中选择n个数的组合
    • 复原IP地址
    • 有效的数独
    • 旋转图像
    • 缺失的第一个正整数
    • 第 N 个泰波那契数
    • 轮转数组
    • 爬楼梯
    • 斐波那契数列
    • 使用最小花费爬楼梯
    • 打家劫舍
    • 删除并获得点数
    • 颜色分类
    • 字母异分词分组
    • 加一
    • N叉树的层序遍历
    • N叉树的前序遍历
    • N叉树的后序遍历
    • N叉树的深度
    • 二叉树的中序遍历
    • 和并两个有序数组
    • 移除元素
    • 删除有序数组中的重复项Ⅱ
    • 多数元素
    • 找到数组的中间位置
    • 搜索插入位置
    • 最长连续序列
    • 三数之和
    • 找到字符串中所有字母异位词
    • 有效的括号
    • 最小栈
    • 求出硬币游戏的玩家
    • Find the odd int
    • Regex validate PIN code
    • Find the next perfect square
  • 折腾

  • 分享

  • 随笔
  • 每日算法
kros
2024-10-21

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

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

# 思路一:循环字符串

循环遍历字符串s并截取相应p长度字符串进行对比。正常遍历提交时无法通过测试,这里做了下面几个个优化:

  • 字符串对比使用先排序后转字符串再进行对比:str.split('').sort().join('')
  • 借助额外对象空间缓存以存在的字符串避免重复进行字符串对比
  • 判断新加入的字符c.length-1是否在p中,不再则
var findAnagrams = function (s, p) {
    let res = [], exist = {[p]: 1}
    let pSort = p.split('').sort().join('')
    exist[pSort] = 1
    for (let i = 0; i <= s.length - p.length; i++) {
        let c = s.slice(i, i + p.length)
        if (exist.hasOwnProperty(c)) {
            res.push(i)
        } else {
            if (!p.includes(c[c.length - 1])) {
                i = i + p.length - 1
            } else {
                if (exist.hasOwnProperty(c)) {
                    res.push(i)
                } else {
                    const cSort = c.split('').sort().join('')
                    if (cSort == pSort) {
                        exist[cSort] = 1
                        exist[c] = 1
                        res.push(i)
                    }
                }
            }
        }
        

    }
    return res
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

遍历

通过优化遍历后可通过测试,但时间消耗有点大,所以下面使用官方提供的另一种思路进行求解

# 思路二:窗口法

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

更多说明见:官方文档 窗口法

var findAnagrams = function (s, p) {
    let res = []
    let pWin = {}, sWin = {}, i = 0
    for(let i = 0; i < p.length; i++) {
        pWin[p[i]] = (pWin[p[i]] || 0) + 1
        sWin[s[i]] = (sWin[s[i]] || 0) + 1
    }
    while(i <= s.length - p.length) {
        let has = true
        for(let key in pWin) {
            if (pWin[key] != sWin[key]) {
                has = false
                break
            }
        }
        has && res.push(i)
        i ++
        sWin[s[i - 1]] = sWin[s[i - 1]] - 1
        if (sWin[s[i - 1]] == 0) {
            delete sWin[s[i - 1]]
        }
        sWin[s[i + p.length - 1]] = (sWin[s[i + p.length - 1]] || 0) + 1
    }
    return res
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

窗口

上次更新: 2025/09/05, 8:09:00
三数之和
有效的括号

← 三数之和 有效的括号→

最近更新
01
Find the next perfect square
09-05
02
Regex validate PIN code
09-05
03
Find the odd int
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 kros king
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev