力扣242. 有效的字母异位词

Java实现 LeetCode 242 有效的字母异位词 242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true 示例 2: 输入: s = “rat”, t = “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的... 阅读详情

题目

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

示例 1:

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

示例 2:

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

提示:

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

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

详解

异或法

首先看到这个题目就想起来了刚刚写过的异或运算:力扣389.找不同-优快云博客

 所以这一题是不是也可以直接异或看结果是否为0呢?就像这样:

class Solution {
    public boolean isAnagram(String s, String t) {
        char c = 0;
        int len1 = s.length();
        int len2 = t.length();
        //记录len为len1、len2中最长的
        int len = Math.max(len1,len2);
        for (int i =0;i< len;i++){
            if (i<len1){
                c ^= s.charAt(i);
            }
            if (i<len2){
                c ^= t.charAt(i);
            }
        }
        if(c == 0){
            return true;
        }else {
            return false;
        }
    }
}

提交结果发现

解答错误

41 / 52 个通过的测试用例

原因是

解法使用了异或运算来判断两个字符串是否是字母异位词,这种方法在某些情况下可能会出错。具体来说,如果两个字符串长度相同,并且它们的字符异或结果为0,那么它们有可能是字母异位词。然而,这种判断方法不够严谨,因为不同的字符组合可能会导致相同的异或结果。

例如,考虑字符串 "ab" 和 "cc",它们的异或结果也是0,但它们并不是字母异位词。因此,这种方法存在误判的风险。

排序比较法

  1. 检查两个字符串的长度是否相同。如果不同,直接返回 false。
  2. 将两个字符串的字符排序,然后比较排序后的结果是否相同。如果相同,则它们是字母异位词。
import java.util.Arrays;

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        
        char[] sArray = s.toCharArray();
        char[] tArray = t.toCharArray();
        
        Arrays.sort(sArray);
        Arrays.sort(tArray);
        
        return Arrays.equals(sArray, tArray);
    }
}

 Arrays.sort(sArray);此方法是排序的常用方法;

进阶

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

这个问题我也尝试了好久,发现上述排序比较法使用toCharArray()方法进行排序的时候,在某些特定的情况下会存在问题,特别是当字符串中包含Unicode补充字符(Supplementary Characters) 时,比如一些 emoji、罕见汉字、特殊符号等。

toCharArray 的适用场景(不会有问题)

  • 普通英文字符(如 a-z, A-Z)

  • 常见的中日韩文字(位于 BMP,即基本多文种平面)

  • 一般符号和数字(如 #, 1, @ 等)

可能出问题的场景:包含 Unicode 补充字符(> U+FFFF)

例如

String str = "a😊b"; char[] chars = str.toCharArray(); System.out.println(Arrays.toString(chars));

输出为:

[a, \ud83d, \ude0a, b]

  • 😊(Unicode U+1F60A)被拆成两个 char:\ud83d 和 \ude0a(代理对)。

  • 排序后可能变成:\ude0a, a, b, \ud83d —— 导致字符显示异常甚至乱码。

 

推荐方案(安全排序方式)

int[] codePoints = str.codePoints().toArray();
Arrays.sort(codePoints);
String sorted = new String(codePoints, 0, codePoints.length);
System.out.println(sorted);

这个方案能正确识别和排序所有字符,不会破坏 emoji 等特殊字符。


总结

方法能否安全排序包含 Unicode 的字符串说明
toCharArray() + Arrays.sort()❌ 不推荐会拆开代理对,造成错误排序或乱码
codePoints() + Arrays.sort()✅ 推荐正确处理所有 Unicode 字符,包括 emoji


如果只处理英文和常见中文,用 toCharArray() 没问题;如果你要考虑 emoji、特殊符号或国际化,务必用 codePoints()。

 

力扣[242]有效的字母异位词 力扣[242]有效的字母异位体 题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词(构成字符串的字母种类和个数均相同,只不过顺序不同)。 题解1:暴力 可以将两个字符串都转化为数组,然后对两个数组先进行排序,如果排序后的数组内容相同,则两个字符串时字母异位体: public boolean isAnagram(String s, String t) { char[] schar = s.toCharArray(); char[] tchar = t.toChar 阅读详情

相关推荐

深度学习之基于Pytorch手指静脉识别系统(

一、项目背景与目标手指静脉识别技术是一种新兴的生物特征识别技术,它依据人类手指中流动的血液可吸收特定波长的光线这一科学原理,利用手指内的静脉分布图像来进行身份识别。与传统的生物识别技术(如指纹识别)相比,手指静脉识别技术具有不易伪造、识别精度高、非接触性等特点,因此在安全性要求较高的场景(如金融、医疗、公安等)具有广阔的应用前景。本项目旨在利用PyTorch深度学习框架,构建一套高效、准确的手指静脉识别系统。

Q1744828575的博客 832

力扣刷题笔记:有效的字母异位词(LeetCode242)

这道题的核心思路就是 “字符计数”,利用小写字母的特性用数组做计数器,简单又高效。其实也可以用哈希表(比如 HashMap)来计数,但对于只有 26 个小写字母的情况,数组比哈希表更快更省空间~​刚开始学的时候可能会疑惑 “为什么最后还要检查一次数组”,多举几个例子就明白了。刷题嘛,就是要多动手试,多画图分析~​今天的分享就到这里,大家赶紧去力扣上试试吧!有问题评论区问我呀,下次见~​。

2501_90563889的博客 1109

WSL子系统启动报错 Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE

WSL子系统启动报错 :Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE 于是分析原因,最终发现是Windows功能中的虚拟机平台功能不知道什么时候被取消了。

Linux I Tell U 6万+

【简单】力扣算法题解析LeetCode242:有效的字母异位词

题目要求判断两个字符串是否为字母异位词(字母相同但排列不同)。解题思路:1)长度不同直接返回false;2)小写字母用26位数组统计字符频次,遍历时若计数<0则false;3)非小写字母改用HashMap统计。Java实现结合数组和HashMap,先检查长度,再按字符类型选择方法,确保高效处理。进阶问题(Unicode字符)通过HashMap解决。

ylumwd的博客 953

STM32F401RCT6最小系统原理图设计

STM32F401RCT6最小系统原理图设计一、主控芯片二、电源电路三、晶振电路三、下载电路四、完整电路图      本文章基于STM32F401RCT6进行最小系统原理图设计,包含主控芯片,电源,晶振电路,下载电路等几部分 一、主控芯片 主控芯片采用STM32F401RCT6,需注意: VBAT在不接电池的情况下需接3.3V,VDDAVREF+需接3.3V,否则会造成芯片供电不正常,无法启动和识别的情况 VDDAVREF+和VCAP1处电容需按照规格书

weixin_43278295的博客 2万+

华为OD机考双机位C卷 - 完美走位 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 完美走位(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 1125

LeetCode 242:有效的字母异位词

使用数组统计字母出现次数是一种高效的方法,时间复杂度为OnO(n)On。在主函数中,通过多组测试用例验证了代码的正确性。对于字符串操作问题,熟悉字符编码和数组操作尤为重要。希望这篇博客能帮助你理解 LeetCode 242 题的解决方案!💡。

weixin_48941116的博客 1144

【25届数字IC秋招总结】面试经验6——经纬恒润

25届数字ic面试记录——经纬恒润

lalala0635的博客 991

day22【LeetCode力扣】242.有效的字母异位词

这种求字母是否重复出现的题,简单暴力的解法就是两层for循环依次比对,并且记录字母出现的次数即可,但是时间复杂度太过高,我们采用哈希的方法来,因为数组本身也是哈希的一种形式。解读:使用collections模块中的Counter类分别对字符串s和t进行计数,将每个字符出现的次数记录在a_count和v_count中。再遍历 字符串s的时候,

canGfly的博客 1139

这种绑定设备的文件拷贝出来了,怎么放到一台新的P100上使用

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1134

我的AI个人公司成立:基于Skills与Qwen大模型的智能问答平台实战开发+龙虾团队

微学AI推出数字员工矩阵,包含10个核心AI角色(总经理、秘书、工程师等),每个角色具备专属技能模块。系统采用FastAPI+Vue3技术栈,核心功能包括:基于SkillLoader的动态技能管理(支持脚本执行和文档加载)、WebSocket流式输出、多轮对话上下文管理。通过模块化架构实现AI自驱协作,可自主完成从需求分析到开发落地的全流程。项目亮点在于声明式技能配置和实时交互能力,打破传统办公壁垒,提升工作效率。

微学AI的博客 1624

LeetCode 242. 有效的字母异位词 java

LeetCode 242. 有效的字母异位词 java 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false 说明: 你可以假设字符串只包含小写字母。 JAVA 代码: class So...

lele的专栏 644

2023,程序员的出路在哪里?

可是似乎从30岁开始这工资就没涨过,前面跳槽几次涨的薪水在30岁以后跳槽已经不管用了、定格了,这几年由于市场环境不景气,程序员竞争越来越激烈,36岁跟30拿的工资一模一样,不仅工资拿的一样,反而事情还越来越多了,这些都意味着什么?处理故障需要的通常不仅仅是写代码的能力,还需要对一个系统的全貌要有一定的掌握。虽然目前不少大型互联网企业都在进行结构性调整,但是从互联网行业发展的基本面来看,未来在产业互联网发展的过程中,IT行业和传统行业将会释放出大量的就业岗位,所以未来程序员的发展空间还是非常值得期待的。

AI天才研究院 20万+

LeetCode 242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词(字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次)。

晴空๓ 1139

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

leetcode 242.有效的字母异位词(python)

leetcode 242.有效的字母异位词(python) 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? 方法1: 暴力, sort(), 0(nlogn) #

pureszgd的博客 998

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

力扣第242题“有效的字母异位词”

在本篇文章中,我们将详细解读力扣第242题“有效的字母异位词”。通过学习本篇文章,读者将掌握如何判断两个字符串是否是字母异位词,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。问题描述解题思路方法一:排序法代码实现。

10年数据\经营分析经验,现任大厂数据分析负责人 735

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LeetCode242有效的字母异位词

LeetCode242有效的字母异位词Easy 题目简述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 输入: s = “anagram”, t = “nagaram” 输出:true 输入: s = “rat”, t = “car” 输出:false 思路:题目本质是判断两个字符串包含的字符是否完全相同 利用哈希表存储出现的字符和对应出现的次数,分别遍历两个字符串,对于 s 往哈希表中增加相应字母的

XBlog 199

讲解Leetcode第242题:有效的字母异位词

输入:s=“anagram”,t=“nagaram”输出:true解释:字符串s和t由相同的字符组成,但是字符出现的顺序不同,故字符串s和t互为字母异位词。

序属秋秋秋的博客 1209

242. 有效的字母异位词(力扣LeetCode)

对于包含 Unicode 字符的字符串,我们不能仅仅使用长度为26的数组来计数,因为 Unicode 字符集非常大。一个可能的解决方案是使用 unordered_map(或 map,取决于性能要求)来动态地存储每个字符及其出现的次数。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。输入: s = “anagram”, t = “nagaram”输入: s = “rat”, t = “car”

m0_73841621的博客 626

LeetCode刷题之242. 有效的字母异位词

LeetCode刷题之242. 有效的字母异位词 我不知道将去向何方,但我已在路上! 时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! 题目: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例: 示例 1 : 输入: s = "anagram", t = "nagaram" 输出: true 示例 2 : 输入: s = "rat", t = "car" 输出: false 说明: 你可以假设字符串只包含小

胡萝卜 285

Leetcode 242. 有效的字母异位词

循环遍历 t,如果对应的字符在 dict 中,且次数大于 0 ,就将次数减 1;如果字符不在 dict 中,返回 False。1.最开始的想法是先求出 s 和 t 的长度,如果不相等就直接返回 False。将 t 转换成 list ,循环遍历 s ,当循环到的字符在 list 中时,将该字符从 list 中删掉;这个想法能通过,就是有点慢。给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

li_yizhixiaowukong的博客 438

【Java力扣算法】LeetCode 242 有效的字母异位词

题目: 给定两个字符串s和t,编写一个函数来判断t是否是s的一个字母异位词。 示例1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法...

懂技术的猫 400

前端与算法 leetcode 242. 有效的字母异位词

文章目录前端与算法 leetcode 242. 有效的字母异位词题目描述概要提示解析解法一:哈希表解法二:数组判断字符出现次数解法三:转换字符串算法传入测试用例的运行结果执行结果GitHub仓库 前端与算法 leetcode 242. 有效的字母异位词 题目描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = "anagra...

墨抒颖 564

3-哈希表-11-有效的字母异位词-LeetCode242

算法:3-哈希表-11-有效的字母异位词-LeetCode242

weixin_43873121的博客 967
上一篇: 力扣28. 找出字符串中第一个匹配项的下标(暴力手撕+KMP算法)
下一篇: 力扣459. 重复的子字符串
AffectionGF
博客等级 码龄3年 78粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值