算法随笔_11: 字符串的排列

devtools/2025/1/19 9:10:36/

上一篇: 算法随笔_10: 供暖器-CSDN博客

题目描述如下:

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

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

示例 1:

输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").

算法思路:

我们设s1的长度为s1_len。通常能想到的算法就是在s2里逐个判断以每个字符为起始点,长度为s1_len的子串,是否是s1的一个排列。

至于如何判断是否是s1的一个排列?我们可以这样做:

1. 拷贝s1字符串到s1_cp数组中。

2. 对于子串sub_str,访问逐个字符,同时每访问一个字符就判断这个字符是否存在于s1_cp中。如果存在,在s1_cp中删除这个字符。全部迭代完之后,如果s1_cp为空,则表示子串sub_str是s1的一个排列。如果不存在这个字符,或者s1_cp不为空,则表示不是一个排列。

我们看到上面这个算法时间复杂度还是挺高的,不是一个较好的算法。接下来我们看看如何进行优化。

我们发现上面步骤2中每存在一个字符就删除一个字符,这是不是就相当于我们数了一下这个字符的个数?当每个字符的个数和s1中每个字符的个数一样的时候,我们就找到了s1的一个排列。

我们基于这个思想,就可以优化上面那个算法了。优化后的步骤如下:

1. 我们提前数好s1的每个字符个数,把它存在一个字典中s1_dct。

2. 迭代子串sub_str一遍,记录每个字符的个数,最后和s1_dct进行比较,判断是否是s1的一个排列。

3.对于s2的每个子串重复步骤2。直至找出答案。

我们还可以继续优化上面的算法。我们发现步骤3里把每个子串都重复了步骤2。其实这是不必要的。由于子串的长度是固定的,这其实类似滑动窗口的机制。窗口的长度就是s1的长度。我们发现每往右滑动一格,前一次的子串的计算结果(即,每个字符的个数)其实可以复用的。只是在计算结果里,相应的减去离开窗口的那个字符一次,并且加上进入窗口的那个字符一次。这样一来整个的算法就很高效了。


http://www.ppmy.cn/devtools/151785.html

相关文章

ElasticSearch DSL查询之复合查询

复合查询 复合查询概述 复合查询是 Elasticsearch 中用来处理多个查询条件组合的一种方式。在实际的业务场景中,我们往往会面对多条件的查询需求,而这些条件可能是复杂的、组合型的,因此需要通过复合查询来实现。 复合查询主要有两种类型&…

试题转excel;word转excel;大风车excel(1.1更新)

更新了大风车excel1.1版本 主要优化在算法层面: 1.0版本试题解析的成功率为95%,现在1.1版本已经优化到解析成功率为99% 一、问题描述 一名教师朋友,偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运,几百道题几…

Agentic AI 和 AI Agent 之间的区别(ChatGPT回答)

提问 Prompt:agentic ai和ai agent之间的区别是什么 "Agentic AI" 和 "AI Agent" 都与人工智能代理相关,但它们有不同的含义和应用背景: Agentic AI 定义:Agentic AI 是指具有代理能力的人工智能系统。这类…

C#表达式和运算符

本文我们将学习C#的两个重要知识点:表达式和运算符。本章内容会理论性稍微强些,我们会尽量多举例进行说明。建议大家边阅读边思考,如果还能边实践就更好了。 1. 表达式 说到表达式,大家可能感觉有些陌生,我们先来举个…

【BUUCTF】[NCTF2019]SQLi

进入题目页面如下 是一个登录界面 尝试万能密码,错误 使用dirsearch目录扫描 发现robots.txt文件 访问robots.txt,发现hint.txt 里面提示了过滤的关键字 下面这行代码的意思是如果 $_POST[passwd] 等于管理员的密码, 那么你将获得标志&…

elasticsearch线程池配置

在Elasticsearch中,默认的线程池配置如下: search线程池 用途:用于处理搜索请求。 特点: 类型为fixed,即固定大小的线程池。 线程数根据分配给Elasticsearch的处理器数量动态计算,以确保搜索请求能够并行…

STM32 FreeROTS Tickless低功耗模式

低功耗模式简介 FreeRTOS 的 Tickless 模式是一种特殊的运行模式,用于最小化系统的时钟中断频率,以降低功耗。在 Tickless 模式下,系统只在有需要时才会启动时钟中断,而在无任务要运行时则完全进入休眠状态,从而降低功…

计算机网络 概述 第一章 1.4

1.4 计算机网络的性能指标 计算机网络的性能指标被用来从不同方面度量计算机网络的性能 先来看比特的概念: 比特(bit,记为小写b)是计算机数据量的基本单位,一个比特就是二进制数字中的一个1或0. 数据量的常用单位有字…