LeetCode题解-第242题:有效的字母异位词
给定两个字符串s
和t
,编写一个函数来判断t
是否是s
的字母异位词。
示例1
:
输入: s = "anagram", t = "nagaram"
输出: true
示例2
:
输入: s = "rat", t = "car"
输出: false
说明: 你可以假设字符串只包含小写字母。
进阶: 如果输入字符串包含Unicode
字符怎么办?你能否调整你的解法来应对这种情况?
来源:力扣(LeetCode
)
链接:https://leetcode-cn.com/problems/valid-anagram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:首先考虑特殊情况,如果字符串s
和t
都为空字符串,则可认为它们互为字母异位词;如果字符串s
和t
连长度都不相等,则一定不为字母异位词。然后再考虑如何进行判断,两个字符串中都只包含26
个小写的英文字母,如果两个字符串是字母异位词,那么一定满足:每一个小写英文字母在字符串s
中出现的次数等于在字符串t
中出现的次数。于是,我们只需分别对每一个小写英文字母在两个字符串中出现的次数进行计数,然后比较是否相等即可。
具体到代码实现层面,由于两个字符串互为字母异位词的前提条件是其长度相等,所以在计数时我们可以同时对两个字符串进行遍历;另一方面,分别计数可以转换成对第一个字符串s
进行计数累加,而对另一个字符串t
进行计数递减,最终如果每一个小写英文字母的累计结果为0
,则可明确这两个字符串互为字母异位词,只要出现一个小写英文字母的累计结果不为0
,则不满足条件。
如何对每一个小写英文字母进行计数?可定义一个长度为26
的int
数组,字母a
到z
依次对应下标索引0
到25
。在遍历字符串s
时,每次遇到a
则将索引0
位置的值加一,以此类推;而当遍历字符串t
时,每次遇到a
则将索引0
位置的值减一。直到遍历完成,判断数组中的所有元素是否都为0
,如果是,则s
和t
互为字母异位词,否则不是。
代码如下:
1 | public boolean isAnagram(String s, String t) { |
进阶问题:
如果输入字符串包含Unicode
字符怎么办?
思路:Unicode
字符可定义100
万个以上的唯一字符,如果还选择使用数组来计数,那么需要开辟出一块非常大的内存空间,而且最后遍历数组也是非常耗时的。于是我们可以考虑使用哈希表来计数,可以适应任意的字符范围,另外最后遍历哈希表判断计数结果时,可将哈希表中的数据去重,即转换成一个无序不重复的Set
集合,利用空间换时间,如果该集合中只存在一个元素且值为0
,则字符串s
和t
互为字母异位词,否则不是。
代码如下:
1 | public boolean isAnagram(String s, String t) { |