【LeetCode刷题笔记(12-1)】【Python】【有效的字母异位词】【排序/字符统计】【简单】

news2024/12/23 23:08:12

文章目录

  • 引言
  • 有效的字母异位词
    • 题目描述
    • 提示
  • 解决方案1:【排序】
  • 解决方案2:【字符统计】
  • 结束语

有效的字母异位词


引言

编写通过所有测试案例的代码并不简单,通常需要深思熟虑理性分析。虽然这些代码能够通过所有的测试案例,但如果不了解代码背后的思考过程,那么这些代码可能并不容易被理解和接受。我编写刷题笔记的初衷,是希望能够与读者们分享一个完整的代码是如何在逐步的理性思考下形成的。我非常欢迎读者的批评和指正,因为我知道我的观点可能并不完全正确,您的反馈将帮助我不断进步。如果我的笔记能给您带来哪怕是一点点的启示,我也会感到非常荣幸。同时,我也希望我的分享能够激发您的灵感和思考,让我们一起在编程的道路上不断前行~

有效的字母异位词

题目描述

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

  • 异位词:指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

  • 输入: s = “anagram”, t = “nagaram”
  • 输出: true

示例 2:

  • 输入: s = “rat”, t = “car”
  • 输出: false

提示

  • 1 <= s.length, t.length <= 5 * 104
  • s 和 t 仅包含小写字母

解决方案1:【排序】

根据题意,我们需要判断给定两个字符串 st 是否互为异位词。异位词是指由【相同字母】【重排列】形成的字符串。从异位词的定义中,我们可以得到两个推论:

  1. st 互为异位词, st 的字符个数必须相同 ⇒ len(s) == len(t) 必须恒成立;
  2. st 互为异位词,那么对st 分别进行字符串排序的结果必然一致;

完整代码如下

class Solution:  
    def isAnagram(self, s: str, t: str) -> bool:  
        """  
        判断两个字符串是否为异位词。  
    
        Args:  
            s (str): 第一个字符串。  
            t (str): 第二个字符串。  
    
        Returns:  
            bool: 如果两个字符串是异位词,返回True;否则返回False。  
        """    
        # 获取字符串s的长度  
        s_len = len(s)  
        # 获取字符串t的长度  
        t_len = len(t)  
  
        # 如果两个字符串的长度不相等,一定不是异位词,直接返回False  
        if s_len != t_len:  
            return False  
  
        # 将字符串s的排序结果与排序后的字符串t进行比较,若一致,返回True,否则返回False  
        return "".join(sorted(s)) == "".join(sorted(t))

运行结果
在这里插入图片描述

问题1:从运行结果来看,还存在一定的优化空间,代码哪些部分占用了大部分时间呢?

从时间复杂度上看,耗时最长的应当是对子串进行排序。假设字符串s的长度为N,那么字符串s进行排序的时间复杂度是O(NlogN)。如果N特别大,会非常耗时。

问题2:能不能在【不需要排序】的情况下,实现字母异位词的对比?

可以!突破局限,转换思路。

在上面的理性分析中,我们提出同时对字符串s和字符串t进行先排序后比较的策略,以验证字符串s与字符串p是否互为字母异位词。当字符串s的长度较小时,这么做无可厚非,但当字符串s的长度很大时,排序算法复杂度O(NlogN)的局限性就出现了。且题意告诉我们,1 <= s.length, t.length <= 5 * 10^4 ==> 字符串s的长度上限已经很大,排序算法顶不住了!

解决方案2:【字符统计】

问题3:还有哪些策略可以实现字母异位词的对比呢?

如果两个字符串互为字母异位词,既然它们的排序结果相同,那么每个字符的出现次数也必然相同。更重要的是,字母的个数是有限的(上限26个) ⇒ 我们可以使用两个长度为26的列表t_counts_count,分别记录字符串st各个字母出现的次数。通过比较字符串st各个字母出现的次数,我们可以在O(N)时间复杂度下解决【有效的字母异位词】问题。

完整代码如下

class Solution:  
    def isAnagram(self, s: str, t: str) -> bool:
        """  
        判断两个字符串是否为异位词。  
    
        Args:  
            s (str): 第一个字符串。  
            t (str): 第二个字符串。  
    
        Returns:  
            bool: 如果两个字符串是异位词,返回True;否则返回False。  
        """    
        # 检查两个字符串的长度是否相等  
        if len(s) != len(t):  
            return False  
  
        # 初始化计数数组,用于记录t和s中每个字符出现的次数  
        t_count = [0] * 26  # 26个字母的计数数组  
        s_count = [0] * 26  # 26个字母的计数数组  
  
        # 遍历t字符串和s字符串,并统计每个字符出现的次数  
        for i in range(len(t)):  
            t_count[ord(t[i]) - ord("a")] += 1  
            s_count[ord(s[i]) - ord("a")] += 1  
  
        # 返回t和s的字符计数是否相等  
        return t_count == s_count

运行结果
在这里插入图片描述
复杂度分析

  • 时间复杂度:O(N),其中 N 是字符串s的长度。
    • 循环遍历ts ===> O(N)
  • 空间复杂度:O(N)
    • 需要用列表记录ts中每个字符出现的次数 ===> O(N)

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1326603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职场必备!这个微信管理效率神器一定要知道

很多小伙伴在管理微信时&#xff0c;都会遇到效率不高的问题&#xff0c;尤其是一些有多个微信号的人&#xff0c;如何高效管理微信成为了一道难题。 今天就给大家分享一款能高效管理微信的工具&#xff0c;让大家既能节省时间又可以提高工作效率&#xff01; 通过微信管理系…

Vue3-23-组件-依赖注入的使用详解

什么是依赖注入 个人的理解 &#xff1a; 依赖注入&#xff0c;是在 一颗 组件树中&#xff0c;由 【前代组件】 给 【后代组件】 提供 属性值的 一种方式 &#xff1b;这种方式 突破了 【父子组件】之间通过 props 的方式传值的限制&#xff0c;只要是 【前代组件】提供的 依…

自动化测试工具-Selenium:WebDriver的API/方法使用全解

我们上一篇文章介绍了Selenium的三大组件&#xff0c;其中介绍了WebDriver是最重要的组件。在这里&#xff0c;我们将看到WebDriver常用的API/方法&#xff08;注&#xff1a;这里使用Python语言来进行演示&#xff09;。 1. WebDriver创建 打开VSCode&#xff0c;我们首先引…

数据结构与算法之美学习笔记:39 | 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想

目录 前言如何理解“回溯算法”&#xff1f;两个回溯算法的经典应用内容小结 前言 本节课程思维导图&#xff1a; 我们在前面深度优先搜索算法利用的是回溯算法思想。这个算法思想非常简单&#xff0c;但是应用却非常广泛。它除了用来指导像深度优先搜索这种经典的算法设计之外…

原生微信小程序中使用-阿里字体图标-详解

步骤一 1、打开阿里巴巴矢量图标库 网址&#xff1a;iconfont-阿里巴巴矢量图标库 2、搜索字体图标&#xff0c;鼠标悬浮点击添加入库 3、按如下步骤添加到自己的项目 步骤二 进入微信开发者工具 1、创建 fonts文件夹 > iconfont.wxss 文件&#xff0c;将刚才的代码复制…

GLTF/GLB模型在线预览、编辑、动画查看以及材质修改

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 GLTF在线编辑器提供了一个内置的模型查看器&#xff0c;可以加载和预…

NC65凭证保存时,报“错误:凭证内部错误号:[10001]凭证借贷金额不平!”

NC65凭证保存时&#xff0c;报“错误:凭证内部错误号&#xff1a;[10001]凭证借贷金额不平&#xff01;” 实际就是分录少录了2分钱。加上去即可。 代码排查&#xff1a; nc.bs.gl.voucher.VoucherBO.save(VoucherVO voucher, Boolean isneedcheck) throws BusinessExceptio…

微服务之服务注册与发现

服务注册发现 服务注册就是维护一个登记簿&#xff0c;它管理系统内所有的服务地址。当新的服务启动后&#xff0c;它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要 Service Provider 地址就行了。当下用于服务注册的工具非常多 ZooKeeper&#xff0c;Consul&…

Centos8一键启动多个Springboot jar包 改进版

一、前言 上篇《Centos8一键启动多个Springboot jar包》写了在centos环境下如何快速启动多个jar包。实际使用下来还是会发现不够完美&#xff0c;如我想重新启动10个jar包里面的两个&#xff0c;我得这么写&#xff1a; ./start.sh restart test1.jar; ./start.sh restart te…

为什么项目管理工具需要项目财务信息?

在讨论项目时&#xff0c;钱是绕不开的话题。 资金是项目管理中最重要的因素之一&#xff0c;与范围和时间并列&#xff0c;三者共同构成了 “三重约束”。例如&#xff0c;如果缩短项目时间&#xff0c;就必须增加成本。 如果无法清楚了解开支及其对项目的影响&#xff08;反…

TrustZone之可信操作系统

有许多可信内核&#xff0c;包括商业和开源的。一个例子是OP-TEE&#xff0c;最初由ST-Ericsson开发&#xff0c;但现在是由Linaro托管的开源项目。OP-TEE提供了一个功能齐全的可信执行环境&#xff0c;您可以在OP-TEE项目网站上找到详细的描述。 OP-TEE的结构如下图所示&…

成熟又专业的内外网文件交换系统,了解一下!

近年来全球网络安全威胁态势的加速严峻&#xff0c;使得企业对于网络安全有了前所未有的关注高度。越来越多的企业在网络安全体系建设和日常工作中&#xff0c;都面临一个核心问题&#xff0c;如何保护企业核心数据资产&#xff1f; 绝大多数企业都在内部实施了网络隔离&#x…

WEB测试之兼容性测试

1. 软件兼容性测试 兼容性测试是指待测试项目在特定的硬件平台上&#xff0c;不同的应用软件之间&#xff0c;不同的操作系统平台上&#xff0c;在不同的网络等环境中能正常的运行的测试。 兼容性测试的目的&#xff1a;待测试项目在不同的操作系统平台上正常运行&#xff0c…

如何通过ETLCloud的API对接功能实现各种SaaS平台数据对接

前言 当前使用SaaS系统的企业越来越多&#xff0c;当我们需要对SaaS系统中产生的数据进行分析和对接时就需要与SaaS系统提供的API进行对接&#xff0c;因为SaaS一般是不会提供数据库表给企业&#xff0c;这时就应该使用ETL&#xff08;Extract, Transform, Load&#xff09;的…

数据挖掘-09-IBM员工流失率预测(包括数据和代码)

文章目录 0. 代码数据下载1. 背景描述2. 探索性数据分析2.1 数据集分布2.2 特征的相关性2.3 散点图可视化 3. 特征工程和分类编程4. 实施机器学习模型3.1 随机森林分类器a. 通过随机森林进行特征排名b. 可视化树形图 3.2 梯度增强分类器a. 基于梯度增强模型的特征排序 3.3 结论…

《每天一分钟学习C语言·四》文本读写操作及二进制读写

fopen(参数1,参数2)&#xff0c;第一个参数是要打开的文件名&#xff0c;文件名字符串&#xff0c;第二个参数用于制定文件打开模式的一个字符串。 注&#xff1a;如果要打开某个盘的文本如F盘test文件夹下的test.txt文本&#xff0c;则fopen(“F:\test\test.txt”,”r”); 程序…

【Spring实战】创建第一个项目

文章目录 使用 Spring Initializr 创建第一个项目1. 打开官网2. 填写信息3. 生成工程4. 解压工程5. 导入 IDEA6. 编写 Hello world7. 启动项目8. 访问验证9. 详细代码最后 Spring 是一个强大且广泛使用的 Java 开发框架&#xff0c;提供了全面的基础设施和工具&#xff0c;用于…

springboot使用Validated实现参数校验

做为后端开发人员&#xff0c;一定有前端传的数据是可能会出错的警惕性&#xff0c;否则程序就可能会出错&#xff0c;比如常遇到的空指针异常&#xff0c;所以为了程序运行的健壮性&#xff0c;我们必须对每一个参数进行合法校验&#xff0c;就能避免很多不必要的错误&#xf…

刷题记录第五十一天-去除重复字母

题目要求的是字典序最小的结果。只需要理解一点就是按大小顺序排列的字符串的字典序就是最小的&#xff0c;如“abcd”这种。 解题思路如下&#xff1a; 首先明确要使用栈结构&#xff0c;并且是从栈底到栈顶递增&#xff0c;要尽可能保证递增&#xff0c;这样就能保证字典序最…

【Java系列】多线程案例学习——单例模式

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录…