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

LCR 014. 字符串的排列

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

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

示例 1:

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

示例 2:

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

提示:

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

法1:滑动窗口

分析:

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

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

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

i=2,遍历s2中的d,

countss2.charCodeAt(i) - 'a'.charCodeAt(0)--=countsd-a--=counts3--

countss2.charCodeAt(i - s1.length) - 'a'.charCodeAt(0)++=countse-a++=counts4++

i=3,遍历s2中的b

countss2.charCodeAt(i) - 'a'.charCodeAt(0)--=countsb-a--=counts1--

countss2.charCodeAt(i - s1.length) - 'a'.charCodeAt(0)++=countsi-a++=counts8++

i=4,遍历s2中的a

countss2.charCodeAt(i) - 'a'.charCodeAt(0)--=countsa-a--=counts0--

countss2.charCodeAt(i - s1.length) - 'a'.charCodeAt(0)++=countsd-a++=counts3++

到这,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;
}
相关推荐
起个名字费劲死了4 分钟前
基于灰度/形状的2D模板匹配
算法
志尊宝5 分钟前
Vue3 零基础每日笔记(085):项目上线前 Checklist——环境变量、报错监控、安全自查
前端·javascript·笔记·安全·信息可视化·echarts
杜 硕9 分钟前
归并排序详解
数据结构·算法·排序算法
志尊宝17 分钟前
Vue3 零基础每日笔记(088·完结):从零到一——一个完整 Vue3 项目的成长复盘
前端·javascript·vue.js·笔记·ecmascript·#vue.js
科技观察哨18 分钟前
国产纳米定位平台与精密位移台量产能力图谱(2026):Z轴压电、XYθZ、六自由度并联与光刻/检测/装配选型指南
网络·人工智能·算法
传人once27 分钟前
企业官网静态页基础结构如何搭
javascript·css
桔筐31 分钟前
Vue中DOM的data-*自定义属性(dataset)与Vue data响应式变量区别详解
前端·javascript·vue.js
damoluomu36 分钟前
静态站点生成器怎么选:Node.js 生态里常用的五个(番外一)
javascript·css·typescript·node.js·html
vipxieliang41 分钟前
JavaScript 执行上下文与调用栈:从原理到调试实战
前端·javascript
西索斯coding1 小时前
Claude Code 工具调用返回空怎么办?claude-opus-5.5 的 input_schema 校验踩坑记录与修复方案
服务器·前端·javascript·ai