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

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

文章目录

  • 引言
  • 有效的字母异位词
    • 题目描述
    • 提示
  • 解决方案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)

结束语

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

相关文章:

  • Tomcat 部署论坛
  • 【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(四)用户管理、部门管理模块
  • 华为云Stack 8.X 流量模型分析(一)
  • 87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验
  • 云原生之深入解析K8S 1.27新特性如何简化状态服务跨集群平滑迁移
  • 实验4.2 默认路由和浮动静态路由的配置
  • C#监听端口报错“以一种访问权限不允许的方式做了访问套接字的尝试”
  • 【网络安全】-Linux操作系统—CentOS安装、配置
  • Flink系列之:Table API Connectors之Debezium
  • Apache Doris 在奇富科技的统一 OLAP 场景探索实践
  • MATLAB 点云中心化 (40)
  • opencv 入门二(播放视频)
  • JDK各个版本特性讲解-JDK14特性
  • 【六大排序详解】开篇 :插入排序 与 希尔排序
  • 智能优化算法应用:基于社会群体算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IOS评论框不贴底(ios12新bug)
  • JS专题之继承
  • python 装饰器(一)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 安装python包到指定虚拟环境
  • 笨办法学C 练习34:动态数组
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 如何在 Tornado 中实现 Middleware
  • 使用Gradle第一次构建Java程序
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一天一个设计模式之JS实现——适配器模式
  • 移动端解决方案学习记录
  • 在Mac OS X上安装 Ruby运行环境
  • 在Unity中实现一个简单的消息管理器
  • Python 之网络式编程
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # C++之functional库用法整理
  • #{}和${}的区别?
  • #NOIP 2014# day.1 T2 联合权值
  • (windows2012共享文件夹和防火墙设置
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (七)Knockout 创建自定义绑定
  • (转)LINQ之路
  • .NET CF命令行调试器MDbg入门(一)
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET成年了,然后呢?
  • []我的函数库
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [20170713] 无法访问SQL Server
  • [20171113]修改表结构删除列相关问题4.txt
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [codeforces]Recover the String