認識promise:相較於普通回撥函式、Promise具有儲存狀態的特點
阿新 • • 發佈:2020-11-21
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