【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)

结束语

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vcomp140.dll丢失怎么办,vcomp140.dll丢失解决方法详解

在我多年的电脑使用经历中&#xff0c;我曾经遇到过一个非常棘手的问题&#xff0c;那就是vcomp140.dll丢失。这个问题让我苦恼了很久&#xff0c;但最终我还是找到了解决方法。今天&#xff0c;我想和大家分享一下我的经历&#xff0c;以及vcomp140.dll是什么&#xff0c;它丢…

【开源软件】最好的开源软件-2023-第四名 vaadin

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

VR全景技术在政务服务中有哪些应用,为政务服务带来什么便利

引言&#xff1a; 随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术正逐渐成为政务服务领域的一项重要工具。其独特的沉浸式体验为政务服务带来了全新的便利&#xff0c;提升了公众参与的积极性。 一、VR全景技术在政务服务中的应用 1.虚拟实景政务…

VUE实现购物商城网站前端源码

文章目录 1.设计来源1.1 登录注册页面1.2 主界面1.3 列表界面1.4 详细界面1.5 购物车界面 2.源码2.1源码目录结构2.2源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/135054910 VUE实现购物商城网站前端源码&…

[CVPR-23] PointAvatar: Deformable Point-based Head Avatars from Videos

[paper | code | proj] 本文的形变方法被成为&#xff1a;Forward DeformationPointAvatar基于点云表征动态场景。目标是根据给定的一段单目相机视频&#xff0c;重建目标的数字人&#xff0c;并且数字人可驱动&#xff1b;通过标定空间&#xff08;canonical space&#xff09…

网络编程day5

作业 1> 使用select完成TCP客户端程序 //client #include<myhead.h> #define CLINET_IP "192.168.125.79" #define CLINET_PORT 9999 #define SERVE_IP "192.168.125.79" #define SERVE_PORT 8888 int main(int argc, const char *argv[]) {/…

JVM垃圾收集器三色标记算法

垃圾收集算法 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法&#xff0c;这种算法没有什么新的思想&#xff0c;只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代&#xff0c;这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比…

作业--day34

使用select完成TCP并发服务器和客户端 server.c #include <myhead.h>#define PORT 8888 #define IP "192.168.125.137"int main(int argc, const char *argv[]) {int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd -1){perror("socket error");re…

融了超24亿元舍不得花,放银行吃利息,这家存储创企厉害了

引言&#xff1a;AI与大模型风起云涌&#xff0c;为什么催生了这匹存储“黑马”&#xff1f; 【阿明观察 &#xff5c; 科技热点关注】 这家总部设在美国的存储初创公司&#xff0c;真的赶上AI与大模型时代的风口了。Vast Data公司最新再次获得E轮融资1.18亿美元&#xff0c;…

开放API签名认证的设计并开发对应的SDK

1. 为什么需要签名认证呢&#xff1f; 假设我们开放了一个接口&#xff0c;而我们的服务器只允许处理1000个请求&#xff0c;如果这个时候由用户疯狂发送几万个请求&#xff0c;可能会导致服务器宕机&#xff0c;影响其他用户的正常使用。这个情况下我们需要对接口进行限流&am…

那些令人惊叹的awk简略写法

​​​​​​​awk是一门美妙的语言&#xff0c;被称为unix命令行工具皇冠上的明珠。它有很多简略写法&#xff0c;用好了可以用极少的代码快速解决问题。 下面就列举一些令人惊叹的awk简略写法&#xff1a; awk {sub(/pattern/, "foobar")} 1 # 无论替换是否成功&…

在scrapy 使用selenium模拟登录获取cookie

前言 最近有一点点爬虫需求&#xff0c;想总结一下scrapy框架的一些基本使用方法&#xff0c;加深印象&#xff0c;自己一直习惯使用一些脚本文件运行爬虫&#xff0c;面对数据量非常大&#xff0c;稳定性要求比较高的&#xff0c;效率需求比较高的情况下还是用scrapy较为合适…