有效的字母异位词[简单]

优质博文:IT-BLOG-CN

一、题目

给定两个字符串st,编写一个函数来判断t是否是s的字母异位词。注意:若st中每个字符出现的次数都相同,则称st互为字母异位词。

示例 1:
输入: s = "anagram", t = "nagaram"
输出: true

示例 2:
输入: s = "rat", t = "car"
输出: false

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

进阶: 如果输入字符串包含unicode字符怎么办?你能否调整你的解法来应对这种情况?

Unicode是为了解决传统字符编码的局限性而产生的方案,它为每个语言中的字符规定了一个唯一的二进制编码。而Unicode中可能存在一个字符对应多个字节的问题,为了让计算机知道多少字节表示一个字符,面向传输的编码方式的UTF−8UTF−16也随之诞生逐渐广泛使用

二、代码

【1】哈希表: 我们用哈希表维护对应字符的频次即可。需要注意Unicode一个字符可能对应多个字节的问题,不同语言对于字符串读取处理的方式是不同的。

class Solution {public boolean isAnagram(String s, String t) {if (s == null || t == null || s.length() != t.length()) {return false;}// 思想:创建1个hashMap存储s的字符为key,value为字符的个数,最后遍历t,对value进行递减,如果小于0则为false;Map<Character,Integer> map = new HashMap();for (int i = 0; i < s.length(); i++) {map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);}for (int i = 0; i < t.length(); i++) {int count = map.getOrDefault(t.charAt(i), 0) - 1;if (count < 0) {return false;}map.put(t.charAt(i), count);}return true;}
}

时间复杂度: O(n)其中ns的长度。
空间复杂度: O(S)其中S为字符集大小,此处S=26

【2】一维数组: 如果不考虑Unicode时,字符串只包含26个小写字母,因此我们可以维护一个长度为26的一维数组table,先遍历记录字符串s中字符出现的频次,然后遍历字符串t,减去table中对应的频次,如果出现table[i]<0,则说明t包含一个不在s中的额外字符,返回false即可。

class Solution {public boolean isAnagram(String s, String t) {if (s == null || t == null || s.length() != t.length()) {return false;}// 维护一个长度为26的一维数组,并将s字符维护进去int[] arr = new int[26];for (int i = 0; i < s.length(); i++) {arr[s.charAt(i) - 'a']++;}// 遍历t字符串,进行count--for (int i = 0; i < t.length(); i++) {arr[t.charAt(i) - 'a']--;if (arr[t.charAt(i) - 'a'] < 0) {return false;}}return true;}
}

时间复杂度: O(n)其中ns的长度。
空间复杂度: O(S)其中S为字符集大小,此处S=26

【3】字符排序: ts的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串st分别排序,看排序后的字符串是否相等即可判断。此外,如果st的长度不同,t必然不是s的异位词。

class Solution {public boolean isAnagram(String s, String t) {if (s == null || t == null || s.length() != t.length()) {return false;}// 投机法:对两个字符串排序后,判断是否相等char[] s1 = s.toCharArray();char[] t1 = t.toCharArray();// 排序Arrays.sort(s1);Arrays.sort(t1);// 判断是否相等return Arrays.equals(s1,t1);}
}

时间复杂度: O(nlog⁡n),其中ns的长度。排序的时间复杂度为O(nlog⁡n),比较两个字符串是否相等时间复杂度为O(n),因此总体时间复杂度为O(nlog⁡n+n)=O(nlog⁡n)
空间复杂度: O(log⁡n)。排序需要O(log⁡n)的空间复杂度。注意,在某些语言(比如Java & JavaScript)中字符串是不可变的,因此我们需要额外的O(n)的空间来拷贝字符串。但是我们忽略这一复杂度分析,因为:这依赖于语言的细节;这取决于函数的设计方式,例如,可以将函数参数类型更改为char[]

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

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

相关文章

万字解析设计模式之原型模式与建造者模式

一、原型模式 1.1概述 原型模式是一种创建型设计模式&#xff0c;其目的是使用已有对象作为原型来创建新的对象。原型模式的核心是克隆&#xff0c;即通过复制已有对象来创建新对象&#xff0c;而不是通过创建新对象的过程中独立地分配和初始化所有需要的资源。这种方式可以节…

shell script 案例二

需求&#xff0c;运行程序&#xff0c;用户输入firstname&#xff0c;回车&#xff0c;再次提示输入lastname&#xff0c;然后回车&#xff0c;屏幕打印fullname信息 注意&#xff1a;前期写程序要注意规范&#xff0c;方便以后自己写多了回头看可以看的懂&#xff0c;程序代码…

如何在麒麟上安装 ONLYOFFICE 桌面编辑器

我们很高兴地告诉大家&#xff0c;ONLYOFFICE 桌面编辑器现已上架麒麟软件商店。请阅读下文了解详情。 关于麒麟 麒麟是一款国产操作系统&#xff0c;主要是为了满足中国市场的需求和偏好而设计的。 它能够与各种硬件平台和软件应用程序的广泛兼容&#xff0c;因而受到认可。…

路由器如何设置IP地址

IP地址是计算机网络中的关键元素&#xff0c;用于标识和定位设备和主机。在家庭或办公室网络中&#xff0c;路由器起到了连接内部设备和外部互联网的关键作用。为了使网络正常运行&#xff0c;需要正确设置路由器的IP地址。本文将介绍如何设置路由器的IP地址&#xff0c;以确保…

性能测试 —— Jmeter日志查看与分析

一、Jmeter日志概览 Jmeter日志文件保存在bin目录中&#xff0c;名称为jmeter.log。我们可以在面板中直接察看日志&#xff0c;点击右上角黄色标志物可以打开日志面板&#xff0c;再次点击收起 另外&#xff0c;Jmeter可以很方便地设置日志输出级别&#xff1a; 通过这种方式修…

在最爱的秋天学习 linux 之 su 和 sudo

文章目录 [toc]你好&#xff0c;su你好&#xff0c;sudo关于 /etc/sudoers 文件四个 AliasDefaultssudo 授权配置语法 搞一下不就知道了配置 sudo免密切换到 root 用户查看当前 sudo 命令范围sudo 审计日志使用子配置文件的方式 开开心心享受生活&#xff0c;没事学学 Linux su…

腾讯云轻量级服务器哪个镜像比较好?

腾讯云轻量应用服务器镜像是什么&#xff1f;镜像就是操作系统&#xff0c;轻量服务器镜像系统怎么选择&#xff1f;如果是用来搭建网站腾讯云百科txybk.com建议选择选择宝塔Linux面板腾讯云专享版&#xff0c;镜像系统根据实际使用来选择&#xff0c;腾讯云百科来详细说下腾讯…

使用shardingJDBC中的雪花算法生成id

常用ID解决方案 数据库自增id 依靠数据库系统的功能实现&#xff0c;但是未来扩容麻烦主从切换时的不⼀致可能会导致重复发号性能瓶颈存在单台sql上 UUID 性能非常高&#xff0c;没有网络消耗无序的字符串&#xff0c;不具备趋势自增特性UUID太长&#xff0c;不易于存储&am…

Django开发实例总结(入门级、4.2.6、详细)

目录 概述 Django的核心组件包括 Django的项目结构 创建工程&#xff08;4.2.6&#xff09; 实例一&#xff1a;Hello world 实例二&#xff1a;访问一个自定义主页 实例三&#xff1a;通过登录跳转到主页 实例四&#xff1a;主页添加静态文件&#xff0c;包含js、css、…

Android开发笔记(三)—Activity篇

活动组件Activity 启动和结束生命周期启动模式信息传递Intent显式Intent隐式Intent 向下一个Activity发送数据向上一个Activity返回数据 附加信息利用资源文件配置字符串利用元数据传递配置信息给应用页面注册快捷方式 启动和结束 &#xff08;1&#xff09;从当前页面跳到新页…

0032Java程序设计-基于JavaEE的智能化酒店点餐收款系统的设计与实现论文

文章目录 摘 要目录系统设计开发环境 摘 要 酒店点餐收款系统是为了实现酒店餐饮自动化管理而设计的&#xff0c;它完全取代了原来酒店餐饮管理一直使用的人工处理的工作方式&#xff0c;并且避免了由于管理人员的工作疏忽以及管理质量问题所造成的各种错误&#xff0c;为及时…

C++并发与多线程(14) | condition_varible、wait、notify_one、notify_all

概念 当谈到并发编程,特别是在多线程或多进程的上下文中,条件变量(Condition Variables)、等待(wait)、通知一个(notify_one)和通知所有(notify_all)是常见的概念。它们用于协调线程的执行,以实现同步并避免竞争条件。以下是对每个术语的解释: 条件变量: 条件变量…

cudnn too short

原因是libcudnn.so为软链接&#xff0c;相当于快捷键&#xff0c;但是没有映射到真正的libcudnn.so.8.9.5上 cd /usr/local/cuda-11.6/lib64 ln -s libcudnn.so.8.9.5 libcudnn.so.8 ln -s libcudnn.so.8.9.5 libcudnn.so

亚马逊云科技为奇点云打造全面、安全、可扩展的数据分析解决方案

刘莹奇点云联合创始人、COO&#xff1a;伴随云计算的发展&#xff0c;数据技术也在快速迭代&#xff0c;成为客户迈入DT时代、实现高质量发展的关键引擎。我们很高兴能和云计算领域的领跑者亚马逊云科技一同&#xff0c;不断为客户提供安全可靠的产品与专业的服务。 超过1500家…

Object转List<>,转List<Map<>>

这样就不会局限在转换到List<Map<String,Object>>这一种类型上了.可以转换成List<Map<String,V>>上等,进行泛型转换虽然多了一个参数,但是可以重载啊注: 感觉field.get(key) 这里处理的不是很好,如果有更好的办法可以留言 public static <K, V> …

SpringMVC 和 RESTful 入门

前言 SpringMVC 是一个流行的 Java Web 框架&#xff0c;它使得编写 RESTful Web 服务变得容易。RESTful 是一种架构风格&#xff0c;允许客户端通过 HTTP 请求访问 Web 服务&#xff0c;而不需要维护服务器端代码。SpringMVC 使用 Spring Boot 框架&#xff0c;这是一个专门用…

0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)

大纲 Tumbling Count WindowsmapreduceWindow Size为2Window Size为3Window Size为4Window Size为5Window Size为6 完整代码参考资料 之前的案例中&#xff0c;我们的Source都是确定内容的数据。而Flink是可以处理流式&#xff08;Streaming&#xff09;数据的&#xff0c;就是…

【C++】set和multiset

文章目录 关联式容器键值对一、set介绍二、set的使用multiset 关联式容器 STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元…

【JAVA学习笔记】58 - 泛型

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter15/src/com/yinhai/generic_ https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter15/src/com/yinhai/customgeneric_ 一、泛型的入门和好处 1)请编写程序&#xff0c;…

Scala 数组(Array)、列表(List)、集合(Set)、映射(Map)和元组(Tuple)

1. 数组(Array) 1.1 定长数组 在 Scala 中&#xff0c;如果你需要一个长度不变的数组&#xff0c;可以使用 Array。但需要注意以下两点&#xff1a; - 在 Scala 中使用 (index) 而不是 [index] 来访问数组中的元素&#xff0c;因为访问元素&#xff0c;对于 Scala 来说是方法调…