LeetCode 242 有效的字母異位詞(JAVA)

陆黎發表於2024-03-19

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;
    }
}

這個是最佳化後的版本。

相關文章