算法打卡日志-2020.11.22| LeetCode242
题目分析
这题最容易想到的解法就是用一个哈希表记录s字符串的字符及个数,在遍历判断t串与哈希表是否吻合。
优化分析
String
,hashMap
有很多设计好的方法可以使我们的代码更加简洁比如:
- 直接使用
s.charAt(index)
可以不用将String
转换为CharArray
再遍历 - 使用
hashMap.getOrDefault(c,0)
,可以优化containsKey
的判断逻辑。使用这项优化需要注意s.length()!=t.length()
的特殊情况。
实际运行测试,两种方式所花费的时间和空间复杂度差不多,但是优化后代码可以更简洁。
查看题解后,发现除了这种哈希表的方式,可以使用排序的方式:分别将两个字符串转换为数组,然后排序,比较排序后的数组,相等返回true。
这一解法理论上时间复杂度为O(nlogn)相比第一种解法的O(n)要复杂,但是leetCode提交测试结果时排序解法显著优于hashMap解法(3ms vs. 16ms),原因可能是leetCode上的测试集都是数据量小的
代码分析
public boolean isAnagram(String s, String t) {
char[] a = s.toCharArray();
char[] b = t.toCharArray();
Map<Character, Integer> charMap = new HashMap<>();
for (Character c : a) {
if (!charMap.containsKey(c)) {
charMap.put(c, 1);
} else {
charMap.put(c, charMap.get(c) + 1);
}
//这个循环内的代码可以优化为:
//char c=s.charAt(i);
//charMap.put(c,charMap.getOrDefault(c,0)+1);
}
for (Character c : b) {
if (charMap.containsKey(c)){
Integer count=charMap.get(c);
if (count>1){
count--;
charMap.put(c,count);
}else {
charMap.remove(c);
}
}else {
return false;
}
}
return charMap.isEmpty();
}
//解法2:排序
public boolean f(String s,String t){
if (s.length() != t.length()) {
return false;
}
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
return Arrays.equals(str1, str2);
}