有效的字母异位词

题目描述

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

示例 1:

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

示例 2:

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

说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

题目链接

Leetcode

题目解答

解法一

排序,拿到一个字符串,先拆分为字符数组,然后对字符排序,之后重新组合成新的字符串,比较两个新字符串的值是否相等即可。

时间复杂度:$O(n\log{}n)$ 空间复杂度:$O(n)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
char[] chs = s.toCharArray();
Arrays.sort(chs);
s = new String(chs);

chs = t.toCharArray();
Arrays.sort(chs);
t = new String(chs);
return s.equals(t);
}
}

执行用时:2 ms, 在所有 Java 提交中击败了99.99%的用户
内存消耗:38.5 MB, 在所有 Java 提交中击败了86.93%的用户

解法二

哈希表,首先字符范围是只包含小写字母,也就是有26个元素,我们可以使用一个长度为26的数组用来统计每个字符出现的次数,对于字符串 s 来说,拿到一个字符,我们对数组下标对应的值加1,对于字符串 t 来说,拿到一个字符,我们对数组下标对应的值减1。统计完成之后,如果两个字符串是异位词,那么数组中所有元素值都应该是0,如果元素值有不为0的情况,则两个字符串不是异位词。

时间复杂度:$O(n)$ 空间复杂度:$O(1)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] chs = new int[26];
for (int i = 0; i < s.length(); i++) {
chs[s.charAt(i) - 'a']++;
chs[t.charAt(i) - 'a']--;
}
for (int count : chs) {
if (count != 0) {
return false;
}
}
return true;
}
}

执行用时:5 ms, 在所有 Java 提交中击败了44.43%的用户
内存消耗:38.6 MB, 在所有 Java 提交中击败了69.49%的用户

-------------本文结束 感谢您的阅读-------------

文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!