数据结构与算法之字符串: LeetCode 567. 字符串的排列 (Ts版)

VOSviewer文献可视化006:修改节点标签文字 由VOSviewer软件生成的可视化图形所显示的文字是小写的,有时候,我们希望其所显示的数据(如国家或作者的首字母等)能够以大写的方式呈现,这时可以进行对节点标签文字的修改操作,使图形显示我们想要的一个效果。 阅读详情

字符串的排列

描述

  • 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的 排列。如果是,返回 true ;否则,返回 false

  • 换句话说,s1 的排列之一是 s2 的 子串

示例 1

输入:s1 = "ab" s2 = "eidbaooo"
输出:true

解释:s2 包含 s1 的排列之一 (“ba”).

示例 2

输入:s1= "ab" s2 = "eidboaoo"
输出:false

提示

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

Typescript 版算法实现


1 ) 方案1:滑动窗口

function checkInclusion(s1: string, s2: string): boolean {
    const n: number = s1.length;
    const m: number = s2.length;

    // 如果 s1 的长度大于 s2,则不可能有排列包含在 s2 中
    if (n > m) {
        return false;
    }

    // 创建两个数组来存储 s1 和当前窗口中每个字符的频率
    const cnt1: number[] = new Array(26).fill(0);
    const cnt2: number[] = new Array(26).fill(0);

    // 统计 s1 和 s2 前 n 个字符的频率
    for (let i = 0; i < n; ++i) {
        cnt1[s1.charCodeAt(i) - 'a'.charCodeAt(0)]++;
        cnt2[s2.charCodeAt(i) - 'a'.charCodeAt(0)]++;
    }

    // 检查初始窗口是否匹配
    if (cnt1.toString() === cnt2.toString()) {
        return true;
    }

    // 滑动窗口遍历 s2 的其余部分
    for (let i = n; i < m; ++i) {
        // 更新当前窗口的频率计数
        cnt2[s2.charCodeAt(i) - 'a'.charCodeAt(0)]++;
        cnt2[s2.charCodeAt(i - n) - 'a'.charCodeAt(0)]--;

        // 检查当前窗口是否匹配
        if (cnt1.toString() === cnt2.toString()) {
            return true;
        }
    }

    return false;
}

2 ) 方案2:滑动窗口优化

function checkInclusion(s1: string, s2: string): boolean {
    const n: number = s1.length;
    const m: number = s2.length;

    // 如果 s1 的长度大于 s2,则不可能有排列包含在 s2 中
    if (n > m) {
        return false;
    }

    // 创建一个数组来存储字符频率差异
    const cnt: number[] = new Array(26).fill(0);

    // 统计 s1 和 s2 前 n 个字符的频率差异
    for (let i = 0; i < n; ++i) {
        --cnt[s1.charCodeAt(i) - 'a'.charCodeAt(0)];
        ++cnt[s2.charCodeAt(i) - 'a'.charCodeAt(0)];
    }

    let diff: number = 0;
    for (const c of cnt) {
        if (c !== 0) {
            ++diff;
        }
    }

    // 检查初始窗口是否匹配
    if (diff === 0) {
        return true;
    }

    // 滑动窗口遍历 s2 的其余部分
    for (let i = n; i < m; ++i) {
        const x: number = s2.charCodeAt(i) - 'a'.charCodeAt(0);
        const y: number = s2.charCodeAt(i - n) - 'a'.charCodeAt(0);

        if (x === y) {
            continue;
        }

        // 更新字符频率差异并调整 diff
        if (cnt[x] === 0) {
            ++diff;
        }
        ++cnt[x];
        if (cnt[x] === 0) {
            --diff;
        }

        if (cnt[y] === 0) {
            ++diff;
        }
        --cnt[y];
        if (cnt[y] === 0) {
            --diff;
        }

        // 检查当前窗口是否匹配
        if (diff === 0) {
            return true;
        }
    }
    return false;
}

3 ) 方案3:双指针

function checkInclusion(s1: string, s2: string): boolean {
    const n: number = s1.length;
    const m: number = s2.length;

    // 如果 s1 的长度大于 s2,则不可能有排列包含在 s2 中
    if (n > m) {
        return false;
    }

    // 创建一个数组来存储字符频率差异
    const cnt: number[] = new Array(26).fill(0);

    // 统计 s1 的每个字符的频率差异
    for (let i = 0; i < n; ++i) {
        --cnt[s1.charCodeAt(i) - 'a'.charCodeAt(0)];
    }

    let left: number = 0;

    // 使用滑动窗口遍历 s2
    for (let right = 0; right < m; ++right) {
        const x: number = s2.charCodeAt(right) - 'a'.charCodeAt(0);
        ++cnt[x];

        // 如果当前字符频率超出,调整左边界
        while (cnt[x] > 0) {
            --cnt[s2.charCodeAt(left) - 'a'.charCodeAt(0)];
            ++left;
        }

        // 检查当前窗口大小是否与 s1 长度相等
        if (right - left + 1 === n) {
            return true;
        }
    }

    return false;
}
基于STM32单片机的环境监测系统设计与实现 综上所述,基于STM32单片机的环境监测系统具有良好的实时性、准确性和稳定性,能够满足环境监测的需求。本系统的研究意义在于,首先,它能够为用户提供准确的室内空气质量信息,帮助用户了解室内环境的质量状况,从而采取相应的措施来改善室内环境。本文设计并实现了一种基于STM32单片机的环境监测系统,该系统能够实时监测并显示室内环境的温湿度、甲醛浓度以及二氧化碳浓度,为用户提供准确的空气质量信息。实验过程中,我们模拟了不同的环境条件,包括温湿度变化、甲醛和二氧化碳浓度的波动等,以测试系统的实时性、准确性和稳定性。 阅读详情

相关推荐

Alipay 支付唤起 h5 测试

测试地址 https://recharge.apps.oppomobile.com/recharge-center/recharge/?from=message try { //唤起客户端快捷参数 var data = {"requestType":"SafePay","fromAppUrlScheme":"alipays","dataString":"h5_ro...

六桥风月IT随笔 1万+

LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)

数组职责混淆(最高发错误)基准数组(存p)是标准答案,初始化后绝对不能修改;窗口移动时,仅能修改窗口计数数组,修改基准数组会导致全部判断失效。判断逻辑嵌套错误窗口初始化的for循环内,不要加入数组比对逻辑;必须等整个窗口统计完成后,再执行一次比对,否则会重复记录下标。列表 append 语法错误res.append(数值)(圆括号);res.append[数值](方括号是取值,不能调用方法)。窗口下标公式记错i - len_p;;下标计算错误会导致取到非法字符,程序报错。

qq_53362375的博客 779

不用买机械臂!用Python+ROS仿真实现RGB-D物体抓取全流程(Gazebo/MoveIt教程)

本文详细介绍了如何利用Python和ROS仿真环境(Gazebo/MoveIt)实现RGB-D物体抓取全流程,无需购买昂贵机械臂硬件。从环境搭建、机械臂模型导入、深度视觉系统配置到MoveIt运动规划,提供完整的实战指南,特别适合个人开发者和学生团队进行机械臂抓取算法验证与开发。

weixin_29061041的博客 341

滑动窗口算法终极指南:从入门到精通的快速学习路径

滑动窗口算法是算法面试中的黄金法则,掌握这一技巧能让你在处理数组和字符串问题时效率倍增。无论你是算法新手还是准备技术面试的开发者,本文都将为你提供完整的滑动窗口学习路径,帮助你在30分钟内掌握这一高效算法技巧。 滑动窗口算法通过维护一个动态变化的区间,避免了重复计算,将时间复杂度从O(n²)优化到O(n),是解决子数组和子串问题的利器。在Awesome LeetCode Resources项目中

gitblog_00681的博客 880

Chroma向量数据库实战:用Python快速搭建本地知识库(附中文诗词检索案例)

本文详细介绍了如何使用Chroma向量数据库和Python快速搭建本地知识库,并附有中文诗词检索的实战案例。通过解析核心概念、数据准备、向量化及智能检索实现,展示了Chroma在处理中文语义搜索时的轻量级与易用性,为开发者构建AI应用原型提供了实用指南。

weixin_29221753的博客 480

【unity】解决unity编译器安装中文汉化包失败

查看是否有Localization目录如果没有就进行创建,然后点击打开Localization把下载的zh-hans.po文件复制剪切进去即可。如果有的同学中文包安装失败,我们找到相应的编译器版本,点击在资源管理器中显示按钮,我们找到简体中文,复制downloadUrl后面的值到浏览器打开进行下载,点击Edtior language选择框,选择简体中文,等待加载。我们点击当前目录的上一级,进入编译器目录。返回在文件管理器中点击Editor目录。编译器启动后点击Edit[编辑]按钮。复制或者剪切下载的文件。

weixin_44959182的博客 8026

doocs/leetcode 题解:面试题 01.02 判定是否互为字符重排(Check Permutation)的计数与排序双解法

本文围绕 LeetCode《程序员面试金典》系列题目「面试题 01.02 判定是否互为字符重排(Check Permutation)」展开,基于 [lcci/01.02.Check Permutation/README.md](https://link.gitcode.com/i/756d0f9a168cc6545ec85a5a540c6610) 的官方题解骨架,结合仓库中 8 种语言的 `Sol

gitblog_00987的博客 204

RAGFlow升级指南(纯小白都看得懂)

升级背景:RAGFlow项目原来的版本是0.17.0版本,在使用过程中,发现当知识库检索为空的时候并且使用到rerank模型的时候,就会输出错误的信息;为了解决这个版本问题,特意升级到最新的版本0.17.2(截止2025-3-14时最新版本就是0.17.2了)官方升级文档https://ragflow.io/docs/dev/upgrade_ragflow官方文档对小白还是不太友好,作者也是捣鼓了十多分钟,特出下面的升级指南前提:旧版本的RAGFlow项目是启动好了的1.在ragflow目录下执行(拉取最新

Ven%的博客 3596

如何用 SGLang Diffusion 加速 LingBot-Video:CFG 并行、Context Parallel 与 GPU 布局完整选型指南

LingBot-Video 是首个开源的大规模 MoE(Mixture-of-Experts)视频生成模型,专为具身智能打造。当你要在多卡上跑 LingBot-Video 推理时,SGLang Diffusion 提供了两大并行维度——CFG 并行与 Context Parallel(上下文并行),再叠加 FSDP 显存切分与 FP8 专家内核,就能显著降低显存压力、提升批量生成吞吐。本文用一张表

gitblog_00996的博客 416

YOLOv11 模型轻量化全流程:从剪枝到量化,打造移动端“极速检测利器”

将浮点模型量化为INT8模型,减少内存占用并加速推理。# 加载剪枝后的模型# 转换为TorchScript# 静态量化# 保存量化模型量化后模型推理速度可再提升20%,而mAP损失小于1%。

m0_64661770的博客 465

RLHF 家族的奇巧魔改:On Policy 与 Off Policy 路线大PK

无论是 On Policy 还是 Off Policy,RLHF 家族的“魔改”之路都充满了奇思妙想。相信随着研究的深入,RLHF 技术将会在 Alignment 领域发挥越来越重要的作用。

步子哥的博客 2083

数据结构与算法笔记:字典序最大问题分析

字典序最大问题 问题描述 给定一个1到n的排列(无序状态的),依次插入到栈中,在每时每刻都可以多次从栈中弹出栈顶 问:应如何使得弹出栈顶的序列的字典序最大,并输出这个序列 问题分析 什么是字典序 比如两个序列:5,4,3,2,1和1,2,3,4,5 这两个中第一个的字典序最大 每个位置上的数字比其他序列上同一位置的数字要大 比如:第一位置中5比1大,第二位置中4比2大这样 即:字典序最大 = 从左向右看这个序列,每个数字都尽量大 题目给定一个1到n的排列,每个数字只出现一次 要使出栈的字典序最大

Wang的专栏 4393

【零基础入门unity游戏开发——unity通用篇12】导入导出unity资源包、设置编程工具、创建脚本(组件)规则、MonoBehaviour基类介绍、脚本模板(基于unity6开发介绍)

导入导出unity资源包、设置编程工具、创建脚本(组件)规则、MonoBehaviour基类介绍、脚本模板(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 765

数据结构与算法笔记:农夫过河问题python3实现

问题描述 农夫(Human)过河。一个农夫带着一只狼(Wolf),一只羊(Sheep)和一些菜(Vegetable)过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河? 要求: 输出一行,为最终的过河方式,方案格式为 过河人员、回来人员、过河人员、回来人员、…、过河人员。 过去和回来的人员之间,用空格隔开。 以四...

Wang的专栏 3374

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据结构与算法笔记:计算思维之经典农夫过河问题C++实现

农夫、羊、狼、菜的过河问题 问题描述 角色:农夫,羊,狼,菜 条件1:船很小,只能装下农夫和其他一个角色 条件2:无人看管,羊吃菜,狼吃羊 问:如何让其他三种角色被农夫平安带着过河? 相关分析 我们可以先用人脑尝试一下相关渡河策略 1 ) 先渡狼,人回来再渡菜,人回来再渡羊 2 ) 先渡菜,人回来再渡狼,人回来再渡羊 以上两种很好想到,而且我们可以知道羊这种角色是不能先渡河过去的,羊需要最后再渡 如果先渡了羊了,之后再渡任何其他角色,都要将羊带回来 可以参考小游戏:http://gameschool

Wang的专栏 3314

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数据结构与算法笔记:图搜索之DFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) !!!本文详解!!! 深度优先搜索DFS 深度优先遍历DFS, 这个策略其实是非常stupid or simple的,比BSF要简单的多 同样,我们可以通过一个故事来开始 在古希腊神话中, Ariadne是Crete的国王Minos的公主,她给忒修斯(Theseus)一个线团 使得忒修斯成功进入迷宫杀死牛头怪兽,但事后忒修斯抛弃了她 这是一个有道德意义的故事又或者存在不同的版本, 但不是我们的研究的对象

Wang的专栏 3119

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据结构与算法笔记:计算思维之人鬼渡河问题

人鬼渡河问题 1 ) 问题描述 目标:将东岸的3人3鬼通过一只小船安全转移到西岸,希望摆渡次数尽可能少 条件 船的容量有限,一次最多只能坐2人(或2鬼或1人1鬼) 无论是在河的东岸还是在河的西岸,一旦鬼数多于人数,则人将被鬼吃掉 怎样渡河的大权掌握在人的手中 说明:划船的时间忽略不计。船一靠岸即将船与岸视为一体,人和鬼即使还没有下 船也视为已上岸 任务:编写程序,求出一种渡河方案 备注:图片托管于github,请确保网络的可访问性 2 ) 分析 目标是找

Wang的专栏 2447

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

1 ) 方案1:模拟。2 ) 方案2:递归。

Wang的专栏 2270

数据结构与算法笔记:计算思维之下楼梯台阶和象棋跳马问题

下台阶问题 1 ) 问题描述 从楼上走到楼下共有 h 个台阶,每一步有三种走法 走一个台阶; 走二个台阶; 走三个台阶。 问:一共可以走出多少种方案? 即共要多少步? 每一步走几级台阶? 2 ) 分析 初始思路 我们根据题目给定的场景,先简单模拟一下,设定 h=4h=4h=4 备注:图片托管于github,请确保网络的可访问性 如上图所示, 这里有4阶楼梯, 红色数字代表每一步走几级台阶 这里枚举了4层台阶的所有可能情况, 但是不管具体有几级台阶,下

Wang的专栏 2113

Python笔记:滑动验证码的识别算法

概述 用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。 准备工作 使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。 关于极验滑动验证码: 极验滑动验证码官网为:http://www.geetest.com/ 验证方式为拖动滑块拼合图像,若图像完全拼合...

Wang的专栏 2104

数据结构与算法之堆: LeetCode 295. 数据流的中位数 (Ts版)

/ 返回 1.5 ((1 + 2) / 2)中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。3 ) 方案3:有序集合 + 双指针。2 ) 方案2:优先队列-优化版。1 ) 方案1:优先队列。

Wang的专栏 1907

数据结构与算法笔记:计算思维之谁做的好事与刑侦作案问题

谁做的好事 清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。 已知:三个人说的是真话,一个人说的是假话。 现在请你根据这些信息,编写程序找出做了好事的人。 分析 将四个人说的四句话(自然语言)转换成计算机可以计算的式子, 可使用循环枚举的方式来判断 (1) 思路一:通过字符表示人 先定义一个字符变量 thisman 表示要寻找的做了好事的人的“名字(代号)”(A、B、C、D),即 char this

Wang的专栏 1833

数据结构与算法笔记:图搜索之BFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) 广度优先搜索BFS 我们可以用比喻来说明广度优先搜索算法 在一片草木枯黄的深秋草原上,在草原的某一处出现了一处野火 一开始的时候野火集中于一点之上,在这点野火耗尽当前植被变成灰烬之前点燃了周围的植被 比如节点s是初始火种,假设我们手中有一个秒表,每过1秒,我们的大火会向外迈进一步 这个过程只能向外,不能向内,因为只能点燃植被,不能把灰烬点燃 蓝色的点是即将变为灰烬的点,红色的点是刚被点燃的点,灰色的圆形或

Wang的专栏 1794

数据结构与算法之动态规划: LeetCode 1494. 并行课程 II (Ts版)

给你一个整数 n 表示某所大学里课程的数目,编号为 1 到 n ,数组 relations 中, relations[i] = [xi, yi] 表示一个先修课的关系,也就是课程 xi 必须在课程 yi 之前上。解释:上图展示了题目输入的图。一个最优方案是:第一学期上课程 2 和 3,第二学期上课程 4 ,第三学期上课程 1 ,第四学期上课程 5。然后第二个学期上课程 1 ,第三个学期上课程 4。在一个学期中,你 最多 可以同时上 k 门课,前提是这些课的先修课在之前的学期里已经上过了。

Wang的专栏 1749

数据结构与算法笔记:求直方图最大面积算法分析

直方图最大面积 问题描述 有n列的直方图,第j列高度为hjh_jhj​, 求一个面积最大的子矩阵 备注:图片托管于github,请确保网络的可访问性 格式要求 输入第一行正整数n,第二行n个空格隔开的非负整数 数据范围: 所有直方图的列不会超过30000 关键算法实现 1 ) 算法1:时间复杂度为: O(n3)O(n^3)O(n3)的实现 分析 矩形面积为底和高的乘积 底部从a到b,那么底边长为: b-a+1 高为:min{hi∣a≤i≤b}min \{h

Wang的专栏 1664

数据结构与算法之LRU: 实现 LRU 缓存算法功能 (Ts, Py, Go版)

LRU - Lease Recently Used 最近使用如果内存优先,只缓存最近使用的,删除 ‘沉睡’ 数据核心 api: get set分析。

Wang的专栏 1599
上一篇: 数据结构与算法之哈希表: LeetCode 1797. 设计一个验证系统 (Ts版)
下一篇: 数据结构与算法之位运算: LeetCode 2166. 设计位集 (Ts版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值