剑指Offer|LCR 014. 字符串的排列

LCR 014. 字符串的排列

给定两个字符串 s1s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。

换句话说,第一个字符串的排列之一是第二个字符串的 子串

示例 1:

复制代码
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").

示例 2:

复制代码
输入: s1= "ab" s2 = "eidboaoo"
输出: False

提示:

  • 1 <= s1.length, s2.length <= 104
  • s1s2 仅包含小写字母

法1:滑动窗口

分析:

建立一个hash表,键是26个字母,对应值是各自出现的次数,为方便键0就代表a,1代表b这样。

看例子:s1 = "ab" s2 = "eidbaooo"

表格中没写的都是填充0。接着遍历后面的s2

i=2,遍历s2中的d,

counts[s2.charCodeAt(i) - 'a'.charCodeAt(0)]--=counts[d-a]--=counts[3]--

counts[s2.charCodeAt(i - s1.length) - 'a'.charCodeAt(0)]++=counts[e-a]++=counts[4]++

i=3,遍历s2中的b

counts[s2.charCodeAt(i) - 'a'.charCodeAt(0)]--=counts[b-a]--=counts[1]--

counts[s2.charCodeAt(i - s1.length) - 'a'.charCodeAt(0)]++=counts[i-a]++=counts[8]++

i=4,遍历s2中的a

counts[s2.charCodeAt(i) - 'a'.charCodeAt(0)]--=counts[a-a]--=counts[0]--

counts[s2.charCodeAt(i - s1.length) - 'a'.charCodeAt(0)]++=counts[d-a]++=counts[3]++

到这,counts全都为0,就返回true

js 复制代码
 var checkInclusion = function(s1, s2) {
    if (s2.length < s1.length)  return false;

    let counts = new Array(26).fill(0);
    // 初始填充 counts 数组
    for (let i = 0; i < s1.length; ++i) {
        counts[s1.charCodeAt(i) - 'a'.charCodeAt(0)]++; // s1 计数 ++
        counts[s2.charCodeAt(i) - 'a'.charCodeAt(0)]--; // s2 计数 --
    }
    // 检查是否已匹配
    if (areAllZero(counts)) {
        return true;
    }

    // 滑动窗口
    // 滑动窗口的大小始终为 s1.length。
    for (let i = s1.length; i < s2.length; ++i) {
        counts[s2.charCodeAt(i) - 'a'.charCodeAt(0)]--;
        counts[s2.charCodeAt(i - s1.length) - 'a'.charCodeAt(0)]++;

        if (areAllZero(counts)) {
            return true;
        }
    }
};

/**
 * 辅助函数:检查 counts 数组是否全部为零
 * @param {number[]} counts
 * @return {boolean}
 */
function areAllZero(counts) {
    for (let count of counts) {
        if (count !== 0) {
            return false;
        }
    }
    return true;
}
相关推荐
牧杉-惊蛰7 分钟前
纯flex布局来写瀑布流
前端·javascript·css
电院工程师7 分钟前
SIMON64/128算法Verilog流水线实现(附Python实现)
python·嵌入式硬件·算法·密码学
轮到我狗叫了7 分钟前
力扣.84柱状图中最大矩形 力扣.134加油站牛客.abb(hard 动态规划+哈希表)牛客.哈夫曼编码
算法·leetcode·职场和发展
丛雨要玩游戏15 分钟前
字符函数和字符串函数
c语言·开发语言·算法
八个程序员30 分钟前
自定义函数(C++)
开发语言·c++·算法
ad钙奶长高高36 分钟前
【C语言】初始C语言
c语言·开发语言·算法
罗西的思考42 分钟前
【Agent】 ACE(Agentic Context Engineering)源码阅读笔记---(3)关键创新
人工智能·算法
报错小能手2 小时前
C++笔记(面向对象)静态联编和动态联编
开发语言·c++·算法
WBluuue2 小时前
AtCoder Beginner Contest 430(ABCDEF)
c++·算法
小肖爱笑不爱笑2 小时前
2025/11/5 IO流(字节流、字符流、字节缓冲流、字符缓冲流) 计算机存储规则(ASCII、GBK、Unicode)
java·开发语言·算法