有效的字母异位词
1.问题描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
2.求解
排序
- 将字符串排序后对比
/*
执行用时:3 ms, 在所有 Java 提交中击败了85.82% 的用户
内存消耗:38.4 MB, 在所有 Java 提交中击败了95.34% 的用户
*/
public boolean isAnagram(String s, String t) {
char[] charS = s.toCharArray();
char[] charT = t.toCharArray();
Arrays.sort(charS);
Arrays.sort(charS);
return String.valueOf(charS).equals(String.valueOf(charT));
}
- 时间复杂度:O(nlogn),排序所用时间复杂度
- 空间复杂度:O(logn),排序使用空间O(logn)
ps:Arrays.equals()方法可以对各个基本类型的数组进行对比
最后可以使用return Arrays.equals(charS,charT);,而不必在转回String比较
哈希表
- 先判断两个字符串长度是否相等,若不相等,返回false
- 维护一个大小为26的数组,记录每个字母出现的字数,遍历另一个字符串,出现一次就将出现次数减一,判断数组记录的值,若出现小于0的值说明两字符串不相等,返回false即可
代码如下
/*
执行用时:2 ms, 在所有 Java 提交中击败了99.91% 的用户
内存消耗:38.7 MB, 在所有 Java 提交中击败了79.48% 的用户
*/
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] table = new int[26];
for (char str : s.toCharArray()) {
table[str - 'a'] += 1;
}
for(char str : t.toCharArray()){
table[str - 'a'] -= 1;
if(table[str - 'a'] < 0){
return false;
}
}
return true;
}
- 时间复杂度:O(n),n为字符串长度
- 空间复杂度:O(s),s为字符集大小,此处为26
用HashMap又写了一遍,效率比数组差很多
/*
执行用时:12 ms, 在所有 Java 提交中击败了21.50% 的用户
内存消耗:39 MB, 在所有 Java 提交中击败了37.78% 的用户
*/
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
Map<Character, Integer> map = new HashMap<>();
for (char str : s.toCharArray()) {
map.merge(str, 1, (oldV, newV) -> oldV + 1);
}
for (char str : t.toCharArray()) {
int count = map.getOrDefault(str, 0);
count--;
if (count < 0) {
return false;
}
map.put(str, count);
}
return true;
}
ps:对于unicode字符就不能使用数组存了,必须要使用HashMap

浙公网安备 33010602011771号