当前位置: 首页 > news >正文

南京app外包/互联网广告优化

南京app外包,互联网广告优化,贵阳网站制作系统,宜春市网站建设comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20014.%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E5%8F%98%E4%BD%8D%E8%AF%8D/README.md 剑指 Offer II 014. 字符串中的变位词 题目描述 给定两个字符…

comments: true
edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20014.%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E5%8F%98%E4%BD%8D%E8%AF%8D/README.md

剑指 Offer II 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
  • s1s2 仅包含小写字母

 

注意:本题与主站 567 题相同: https://leetcode.cn/problems/permutation-in-string/

解法

方法一:滑动窗口

不妨记字符串 s 1 s1 s1 的长度为 m m m,字符串 s 2 s2 s2 的长度为 n n n

我们观察发现,题目实际上等价于判断字符串 s 2 s2 s2 中是否存在窗口大小为 m m m,且窗口内的字符及其个数与字符串 s 1 s1 s1 相同的子串。

因此,我们先用哈希表或数组 c n t 1 cnt1 cnt1 统计字符串 s 1 s1 s1 中每个字符出现的次数,然后遍历字符串 s 2 s2 s2,维护一个窗口大小为 m m m 的滑动窗口,用哈希表或数组 c n t 2 cnt2 cnt2 统计窗口内每个字符出现的次数,当 c n t 1 = c n t 2 cnt1 = cnt2 cnt1=cnt2 时,说明窗口内的字符及其个数与字符串 s 1 s1 s1 相同,返回 true 即可。

否则,遍历结束后,返回 false

时间复杂度 ( m + n × ∣ Σ ∣ ) (m + n \times |\Sigma|) (m+n×∣Σ∣),空间复杂度 O ( ∣ Σ ∣ ) O(|\Sigma|) O(∣Σ∣)。其中 m m m n n n 分别为字符串 s 1 s1 s1 s 2 s2 s2 的长度;而 ∣ Σ ∣ |\Sigma| ∣Σ∣ 为字符集的大小,本题中 ∣ Σ ∣ = 26 |\Sigma|=26 ∣Σ∣=26

Python3
class Solution:def checkInclusion(self, s1: str, s2: str) -> bool:m, n = len(s1), len(s2)if m > n:return Falsecnt1 = Counter(s1)#前m字符cnt2 = Counter(s2[:m])if cnt1 == cnt2:return True#定长窗口for i in range(m, n):cnt2[s2[i]] += 1cnt2[s2[i - m]] -= 1if cnt1 == cnt2:return Truereturn False
Java
class Solution {public boolean checkInclusion(String s1, String s2) {int m = s1.length();int n = s2.length();if (m > n) {return false;}int[] cnt1 = new int[26];int[] cnt2 = new int[26];for (int i = 0; i < m; ++i) {++cnt1[s1.charAt(i) - 'a'];++cnt2[s2.charAt(i) - 'a'];}if (Arrays.equals(cnt1, cnt2)) {return true;}for (int i = m; i < n; ++i) {++cnt2[s2.charAt(i) - 'a'];--cnt2[s2.charAt(i - m) - 'a'];if (Arrays.equals(cnt1, cnt2)) {return true;}}return false;}
}
C++
class Solution {
public:bool checkInclusion(string s1, string s2) {int m = s1.size(), n = s2.size();if (m > n) {return false;}vector<int> cnt1(26), cnt2(26);for (int i = 0; i < m; ++i) {++cnt1[s1[i] - 'a'];++cnt2[s2[i] - 'a'];}if (cnt1 == cnt2) {return true;}for (int i = m; i < n; ++i) {++cnt2[s2[i] - 'a'];--cnt2[s2[i - m] - 'a'];if (cnt1 == cnt2) {return true;}}return false;}
};
Go
func checkInclusion(s1 string, s2 string) bool {m, n := len(s1), len(s2)if m > n {return false}var cnt1, cnt2 [26]intfor i := 0; i < m; i++ {cnt1[s1[i]-'a']++cnt2[s2[i]-'a']++}if cnt1 == cnt2 {return true}for i := m; i < n; i++ {cnt2[s2[i]-'a']++cnt2[s2[i-m]-'a']--if cnt1 == cnt2 {return true}}return false
}
TypeScript
function checkInclusion(s1: string, s2: string): boolean {const m = s1.length;const n = s2.length;if (m > n) {return false;}const cnt1 = new Array(26).fill(0);const cnt2 = new Array(26).fill(0);for (let i = 0; i < m; ++i) {++cnt1[s1[i].charCodeAt(0) - 'a'.charCodeAt(0)];++cnt2[s2[i].charCodeAt(0) - 'a'.charCodeAt(0)];}if (cnt1.toString() === cnt2.toString()) {return true;}for (let i = m; i < n; ++i) {++cnt2[s2[i].charCodeAt(0) - 'a'.charCodeAt(0)];--cnt2[s2[i - m].charCodeAt(0) - 'a'.charCodeAt(0)];if (cnt1.toString() === cnt2.toString()) {return true;}}return false;
}

方法二:滑动窗口优化

在方法一中,我们每次加入和移除一个字符时,都需要比较两个哈希表或数组,时间复杂度较高。我们可以维护一个变量 d i f f diff diff,表示两个大小为 m m m 的字符串中,有多少种 字符出现的个数 不同。当 d i f f = 0 diff=0 diff=0 时,说明两个字符串中的字符个数相同。

时间复杂度 O ( m + n + ∣ Σ ∣ ) O(m + n + |\Sigma|) O(m+n+∣Σ∣),空间复杂度 O ( ∣ Σ ∣ ) O(|\Sigma|) O(∣Σ∣)。其中 m m m n n n 分别为字符串 s 1 s1 s1 s 2 s2 s2 的长度;而 ∣ Σ ∣ |\Sigma| ∣Σ∣ 为字符集的大小,本题中 ∣ Σ ∣ = 26 |\Sigma|=26 ∣Σ∣=26

Python3
class Solution:def checkInclusion(self, s1: str, s2: str) -> bool:m,n=len(s1),len(s2)if m>n:return False#初始化m窗口cnt=Counter()for a,b in zip(s1,s2[:m]):#例如,如果s1有字符a出现两次,s2前m个字符中的a出现一次,那么cnt[a]的值会是-1#(因为从s1的角度,它应该出现两次,而s2中出现一次,所以差异是-1)。cnt[a]-=1 #用s2去满足缺失cnt[b]+=1diff=sum(v!=0 for v in cnt.values()) if diff==0:return True #说明s2前m字符含字串#滑动定长窗口for i in range(m,n):a,b=s2[i-m],s2[i] #待删,待新增#根据移动之前cnt的情况,判断对diff的影响if cnt[a]==0:diff+=1if cnt[b]==0:diff+=1cnt[a]-=1cnt[b]+=1#根据移动之后cnt的情况,判断对diff的影响if cnt[a]==0:diff-=1if cnt[b]==0:diff-=1if diff==0:return Truereturn False
Java
class Solution {public boolean checkInclusion(String s1, String s2) {int m = s1.length();int n = s2.length();if (m > n) {return false;}int[] cnt = new int[26];for (int i = 0; i < m; ++i) {--cnt[s1.charAt(i) - 'a'];++cnt[s2.charAt(i) - 'a'];}int diff = 0;for (int x : cnt) {if (x != 0) {++diff;}}if (diff == 0) {return true;}for (int i = m; i < n; ++i) {int a = s2.charAt(i - m) - 'a';int b = s2.charAt(i) - 'a';if (cnt[a] == 0) {++diff;}--cnt[a];if (cnt[a] == 0) {--diff;}if (cnt[b] == 0) {++diff;}++cnt[b];if (cnt[b] == 0) {--diff;}if (diff == 0) {return true;}}return false;}
}
C++
class Solution {
public:bool checkInclusion(string s1, string s2) {int m = s1.size(), n = s2.size();if (m > n) {return false;}vector<int> cnt(26);for (int i = 0; i < m; ++i) {--cnt[s1[i] - 'a'];++cnt[s2[i] - 'a'];}int diff = 0;for (int x : cnt) {if (x != 0) {++diff;}}if (diff == 0) {return true;}for (int i = m; i < n; ++i) {int a = s2[i - m] - 'a';int b = s2[i] - 'a';if (cnt[a] == 0) {++diff;}--cnt[a];if (cnt[a] == 0) {--diff;}if (cnt[b] == 0) {++diff;}++cnt[b];if (cnt[b] == 0) {--diff;}if (diff == 0) {return true;}}return false;}
};
Go
func checkInclusion(s1 string, s2 string) bool {m, n := len(s1), len(s2)if m > n {return false}cnt := [26]int{}for i := 0; i < m; i++ {cnt[s1[i]-'a']--cnt[s2[i]-'a']++}diff := 0for _, x := range cnt {if x != 0 {diff++}}if diff == 0 {return true}for i := m; i < n; i++ {a, b := s2[i-m]-'a', s2[i]-'a'if cnt[a] == 0 {diff++}cnt[a]--if cnt[a] == 0 {diff--}if cnt[b] == 0 {diff++}cnt[b]++if cnt[b] == 0 {diff--}if diff == 0 {return true}}return false
}
TypeScript
function checkInclusion(s1: string, s2: string): boolean {const m = s1.length;const n = s2.length;if (m > n) {return false;}const cnt: number[] = new Array(26).fill(0);for (let i = 0; i < m; ++i) {--cnt[s1[i].charCodeAt(0) - 'a'.charCodeAt(0)];++cnt[s2[i].charCodeAt(0) - 'a'.charCodeAt(0)];}let diff = 0;for (const x of cnt) {if (x !== 0) {++diff;}}if (diff === 0) {return true;}for (let i = m; i < n; ++i) {const a = s2[i - m].charCodeAt(0) - 'a'.charCodeAt(0);const b = s2[i].charCodeAt(0) - 'a'.charCodeAt(0);if (cnt[a] === 0) {++diff;}if (--cnt[a] === 0) {--diff;}if (cnt[b] === 0) {++diff;}if (++cnt[b] === 0) {--diff;}if (diff === 0) {return true;}}return false;
}
Swift
class Solution {func checkInclusion(_ s1: String, _ s2: String) -> Bool {let m = s1.countlet n = s2.countif m > n {return false}var cnt1 = [Int](repeating: 0, count: 26)var cnt2 = [Int](repeating: 0, count: 26)let aAscii = Character("a").asciiValue!for i in 0..<m {cnt1[Int(s1[s1.index(s1.startIndex, offsetBy: i)].asciiValue! - aAscii)] += 1cnt2[Int(s2[s2.index(s2.startIndex, offsetBy: i)].asciiValue! - aAscii)] += 1}if cnt1 == cnt2 {return true}for i in m..<n {cnt2[Int(s2[s2.index(s2.startIndex, offsetBy: i)].asciiValue! - aAscii)] += 1cnt2[Int(s2[s2.index(s2.startIndex, offsetBy: i - m)].asciiValue! - aAscii)] -= 1if cnt1 == cnt2 {return true}}return false}
}

相关文章:

剑指 Offer II 014. 字符串中的变位词

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20014.%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E5%8F%98%E4%BD%8D%E8%AF%8D/README.md 剑指 Offer II 014. 字符串中的变位词 题目描述 给定两个字符…...

富唯智能复合机器人拓展工业新维度

富唯智能复合机器人是富唯智能倾力打造的一款集高度自动化、智能化和多功能性于一体的机器人。它融合了机械、电子、计算机、传感器等多个领域的前沿技术&#xff0c;通过精密的算法和控制系统&#xff0c;实现了对复杂生产环境的快速适应和高效作业。 富唯智能复合机器人的特点…...

【大数据技术】搭建完全分布式高可用大数据集群(Scala+Spark)

搭建完全分布式高可用大数据集群(Scala+Spark) scala-2.13.16.tgzspark-3.5.4-bin-without-hadoop.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群Spark的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/softwa…...

solidity高阶 -- 调用接口合约

在区块链开发中&#xff0c;Solidity 是一种广泛使用的智能合约编程语言&#xff0c;而接口合约&#xff08;Interface&#xff09;是 Solidity 中一个非常重要的概念。它为智能合约之间的交互提供了一种标准化的方式&#xff0c;使得合约之间的调用更加灵活、安全且易于管理。…...

若依框架使用(低级)

克隆源码 浏览器搜索若依&#xff0c;选择 RuoYi-Vue RuoYi-Vue RuoYi-Vue 重要的事情说三遍&#xff0c;进入gitee 下面这个页面&#xff08;注意红色框起来的部分&#xff09; 进入Gitee进行下载 我下载的是最新的springboot3 下载好后我们可以选择一个文件夹&#xff0…...

找不到 MSVCP120.dll

msvcr120.dll msvcr120.dll 是 Microsoft Visual C Redistributable 的一部分&#xff0c;属于 Visual Studio 2013&#xff08;VC 12.0&#xff09;的运行时组件。它的重要性取决于你运行的应用程序是否需要它。 重要性 依赖库&#xff1a;如果某个程序是用 Visual Studio 2…...

AI软件栈:LLVM分析(三)

LLVM IR 文章目录 CFG线性IR 主要采用CFG与线性IR组合描述 CFG *关键在于基本块&#xff08;Basic Block&#xff09;的定义 线性IR *关键来自于SSA&#xff0c;单静态赋值...

openwebui入门

1 简介 ‌Open WebUI‌&#xff08;网址是openwebui.com&#xff09;是一个高度可扩展、功能强大且用户友好的自托管Web用户界面&#xff0c;专为完全离线操作设计&#xff0c;编程语言是python。它支持对接Ollama和OpenAI兼容的API的大模型。‌ Open WebUI‌在架构上是一种中…...

Spark--如何理解RDD

1、概念 rdd是对数据集的逻辑表示&#xff0c;本身并不存储数据&#xff0c;只是封装了计算逻辑&#xff0c;并构建执行计划&#xff0c;通过保存血缘关系来记录rdd的执行过程和历史&#xff08;当一个rdd需要重算时&#xff0c;系统会根据血缘关系追溯到最初的数据源&#xff…...

CTFSHOW-WEB入门-PHP特性89-100

题目&#xff1a;web 89 题目&#xff1a;解题思路&#xff1a;这道题目涉及了两个函数&#xff1a;preg_match&#xff08;&#xff09;和intval&#xff08;&#xff09;简要介绍一下两个函数 preg_match&#xff08;&#xff09;用于对字符串进行正则表达式的匹配&#xff0…...

[250204] Mistral Small 3:小巧、快速、强大 | asdf 0.16.0 发布:Golang 重写带来性能飞跃

目录 Mistral AI 发布开源模型 Mistral Small 3&#xff1a;小巧、快速、强大asdf 0.16.0 版本发布&#xff1a;Golang 重写带来性能飞跃&#xff01; Mistral AI 发布开源模型 Mistral Small 3&#xff1a;小巧、快速、强大 法国人工智能初创公司 Mistral AI 发布了最新的开源…...

PySpark学习笔记5-SparkSQL

sparkSql的数据抽象有两种。 一类是data set适用于java和Scala 一类是data frame适用于java&#xff0c;Scala&#xff0c;python 将r d d转换为data frame #方式一 df spark.createDataFrame(rdd,schema[name,age]) #方式二 schema Structtype(). add(id,integertype(),nu…...

windows版的docker如何使用宿主机的GPU

windows版的docker使用宿主机的GPU的命令 命令如下 docker run -it --nethost --gpus all --name 容器名 -e NVIDIA_DRIVER_CAPABILITIEScompute,utility -e NVIDIA_VISIBLE_DEVICESall 镜像名效果 (transformer) rootdocker-desktop:/# python Python 3.9.0 (default, Nov 15 …...

Python爬虫:1药城店铺爬虫(完整代码)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…...

代码随想录算法训练营打卡第55天:并查集相关问题;

Java并查集的模板 //并查集模板 class DisJoint{private int[] father;public DisJoint(int N) {father new int[N];for (int i 0; i < N; i){father[i] i;}}public int find(int n) {return n father[n] ? n : (father[n] find(father[n]));}public void join (int …...

K8S学习笔记-------1.安装部署K8S集群环境

1.修改为root权限 #sudo su 2.修改主机名 #hostnamectl set-hostname k8s-master01 3.查看网络地址 sudo nano /etc/netplan/01-netcfg.yaml4.使网络配置修改生效 sudo netplan apply5.修改UUID&#xff08;某些虚拟机系统&#xff0c;需要设置才能生成UUID&#xff09;#…...

云原生周刊:K8s引领潮流

开源项目推荐 KWOK KWOK&#xff08;Kubernetes WithOut Kubelet&#xff09;是一个开源项目&#xff0c;旨在提供一个轻量级的 K8s 集群模拟环境&#xff0c;允许用户在不依赖真实节点的情况下&#xff0c;本地模拟整个 K8s 集群。它通过模拟 Kubelet 和其他集群组件的行为&…...

C_位运算符及其在单片机寄存器的操作

C语言的位运算符用于直接操作二进制位&#xff0c;本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。 一、位运算符的简单说明 1、按位与运算符&#xff08;&&#xff09; 功能&#xff1a;按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…...

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…...

Selenium 浏览器操作与使用技巧——详细解析(Java版)

目录 一、浏览器及窗口操作 二、键盘与鼠标操作 三、勾选复选框 四、多层框架/窗口定位 五、操作下拉框 六、上传文件操作 七、处理弹窗与 alert 八、处理动态元素 九、使用 Selenium 进行网站监控 前言 Selenium 是一款非常强大的 Web 自动化测试工具&#xff0c;能够…...

ioDraw桌面版 v3.4.0发布!AI文生图,AI图生图,手绘风格一键转换!

流程图功能升级 AI 文生图&#xff1a; 用户现在能输入文字描述&#xff0c;让软件自动生成对应的流程图画面&#xff0c;减少了手动绘图的工作量&#xff0c;提高创作效率&#xff0c;比如输入 “项目开发流程”&#xff0c;软件可能就会生成包含需求分析、设计、开发、测试…...

深入理解Node.js_架构与最佳实践

1. 引言 1.1 什么是Node.js Node.js简介:Node.js是一个基于Chrome V8引擎的JavaScript运行时,用于构建快速、可扩展的网络应用。Node.js的历史背景和发展:Node.js最初由Ryan Dahl在2009年发布,旨在解决I/O密集型应用的性能问题。随着时间的推移,Node.js社区不断壮大,提供…...

安装和卸载RabbitMQ

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/SUWXdDb0UoCV86xP6b3c7qtMn6b 使用Ubuntu环境进行安装 一、安装Erlang 在安装RabbitMQ之前,我们需要先安装Erlang,RabbitMQ需要Erlang的语言支持 #安装Erlang sudo apt-get install erlang 在安装的过程中,会弹出一段信息,此…...

第27节课:安全审计与防御—构建坚固的网络安全防线

目录 安全审计工具与流程安全审计工具NessusNmapBurp Suite 安全审计流程规划与准备信息收集漏洞扫描分析与评估报告与建议 安全防御策略网络层防御应用层防御数据层防御安全管理 结语 在当今数字化时代&#xff0c;网络安全已成为企业和个人不可忽视的重要议题。随着网络攻击手…...

【蓝桥杯】日志统计

日志统计&#xff08;编程题&#xff09;https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53 题目 日志统计(编程题) 讲解 这个讲解感觉比较通俗易懂。 蓝桥杯2018年省赛B组08&#xff08;c/c&#xff09;日…...

23.Word:小王-制作公司战略规划文档❗【5】

目录 NO1.2.3.4 NO5.6​ NO7.8.9​ NO10.11​ NO12​ NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张&#xff1a;纸张大小&#xff1a;宽度/高度→页边距&#xff1a;上下左右→版式&#xff1a;页眉页脚→文档网格&#xff1a;勾选只指定行网格✔→ 每页&#xff1a;…...

基于单片机的智能安全插座(论文+源码)

1 系统整体方案设计 本课题基于单片机的智能安全插座设计&#xff0c;以STM32嵌入式单片机为主体&#xff0c;将计算机技术和检测技术有机结合&#xff0c;设计一款电量参数采集装置&#xff0c;实现电压、电流信号的数据采集任务&#xff0c;电压、电流和功率在上位机的显示任…...

2025年人工智能技术:Prompt与Agent的发展趋势与机遇

文章目录 一、Prompt与Agent的定义与区别(一)定义(二)区别二、2025年Prompt与Agent的应用场景(一)Prompt的应用场景(二)Agent的应用场景三、2025年Prompt与Agent的适合群体(一)Prompt适合的群体(二)Agent适合的群体四、2025年Prompt与Agent的发展机遇(一)Prompt的…...

vue2-v-if和v-for的优先级

vue2-v-if和v-for的优先级 1.v-if和v-for的作用 v-if是条件渲染&#xff0c;只有条件表达式true的情况下&#xff0c;才会渲染v-for是基于一个数组来渲染一个列表&#xff0c;在v-for的时候&#xff0c;保证给每个元素添加独一无二的key值&#xff0c;便于diff算法进行优化 …...

C++六大默认成员函数

C六大默认成员函数 默认构造函数默认析构函数RAII技术RAII的核心思想优点示例应用场景 默认拷贝构造深拷贝和浅拷贝 默认拷贝赋值运算符移动构造函数&#xff08;C11起&#xff09;默认移动赋值运算符&#xff08;C11起&#xff09;取地址及const取地址操作符重载取地址操作符重…...