1. 程式人生 > 實用技巧 >認識promise:相較於普通回撥函式、Promise具有儲存狀態的特點

認識promise:相較於普通回撥函式、Promise具有儲存狀態的特點

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