LeetCode 242 有效的字母異位詞(JAVA)
一、題目描述:
給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的字母異位詞。
注意:若 s 和 t 中每個字元出現的次數都相同,則稱 s 和 t 互為字母異位詞。
示例 1:
輸入: s = "anagram", t = "nagaram"
輸出: true
示例 2:
輸入: s = "rat", t = "car"
輸出: false
提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 僅包含小寫字母
二、題目分析:
該問題針對的是陣列物件。由於題目已經明確只包含小寫字母,則無需考慮其他字元的情況。
字母異位詞的含義為兩個字串的字元出現次數相同,則互為字母異位詞。如'anagram'與'nagaram'.
這裡我考慮採用map,透過鍵值對的形式記錄下字串中的字元與出現次數,然後在比較兩個map是否一致。
三、開始作答:
class Solution {
public boolean isAnagram(String s, String t) {
Map<Character,Integer> mapA = new HashMap<>();
Map<Character,Integer> mapB = new HashMap<>();
//計算s的字元和次數
for(int i = 0; i< s.length();i++){
mapA.put(s.charAt(i),mapA.getOrDefault(s.charAt(i),0) + 1);
}
//計算t的字元和次數
for(int i = 0; i< t.length();i++){
mapB.put(t.charAt(i),mapB.getOrDefault(t.charAt(i),0) + 1);
}
//判斷是否相等
if(mapA.equals(mapB)){
return true;
}else{
return false;
}
}
}
四、檢視題解:
看完題解後,發現自己有點呆,直接透過陣列就能完成。同時也忽略了一些特判。
1.首先判斷兩個字串陣列是否相等,如果不相等那必然不是字母異位詞。
2.初始化字母雜湊表,遍歷s和t.這一步申請的空間根據字母表大小申請,控制陣列大小。
3.s在對應的位置增加,t在對應的位置減少,最後雜湊表每個值都為0,則說明是字母異位詞。
class Solution {
public boolean isAnagram(String s, String t) {
//特判
if(s.length() != t.length()){
return false;
}
//初始化雜湊表
int[] hash = new int[26];
for(int i = 0; i<s.length();i++){
//遍歷s字串,在對應位置計數
hash[s.charAt(i) - 'a'] ++;
//遍歷t字串,在對應位置減去計數
hash[t.charAt(i) - 'a'] --;
}
//最後判斷hash表的每一個值是否都為0,如果為0則為字母異位詞
for(int i = 0; i< 26; i++){
if(hash[i] != 0){
return false;
}
}
return true;
}
}
這個是最佳化後的版本。