Loading

有效的字母异位词

1.问题描述

给定两个字符串 st ,编写一个函数来判断 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

posted @ 2020-11-22 15:23  水纸杯  阅读(101)  评论(0)    收藏  举报