算法打卡日志-2020.11.22| LeetCode242

题目 242. 有效的字母异位词

题目分析

这题最容易想到的解法就是用一个哈希表记录s字符串的字符及个数,在遍历判断t串与哈希表是否吻合。

优化分析

StringhashMap有很多设计好的方法可以使我们的代码更加简洁比如:

  1. 直接使用s.charAt(index)可以不用将String转换为CharArray再遍历
  2. 使用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);
}
posted @ 2020-11-23 09:45  PPPPu  阅读(56)  评论(0)    收藏  举报