快轉到主要內容
leetcode 242 - Valid Anagram

leetcode 242 - Valid Anagram

·
類別 
Leetcode
標籤 
Java Leetcode Easy String Problem Blind75
Eason Chiu
作者
Eason Chiu
一個不做筆記就容易忘記的工程師
目錄

題目
#

leetcode 242 - Valid Anagram (題目說明請點連結)

題目簡述
#

判斷兩個字串是否為有效的字母異位詞。

範例
#

Example 1:

Input: s = "anagram", t = "nagaram"
Output: true
Explanation: "anagram" 和 "nagaram" 是有效的字母異位詞。

Example 2:

Input: s = "rat", t = "car"
Output: false
Explanation: "rat" 和 "car" 不是有效的字母異位詞。

解題思路
#

這題要求我們判斷兩個字串是否為有效的字母異位詞。字母異位詞是指兩個字串中每個字母出現的次數相同。我們可以使用 HashMap 來記錄第一個字串中每個字母的出現次數,然後遍歷第二個字串來檢查每個字母的出現次數是否一致。

解法
#

HashMap 計數法(HashMap Counting Approach)

  1. 如果兩個字串長度不同,直接返回 false
  2. 使用 HashMap 記錄第一個字串中每個字母的出現次數
  3. 遍歷第二個字串,對每個字母:
    • 如果該字母不在 HashMap 中或次數為 0,返回 false
    • 否則將該字母的次數減 1
  4. 如果所有字母的次數都匹配,返回 true

步驟
#

  • 初始化:
    • 檢查字串長度是否相同
    • 創建 HashMap<Character, Integer> map
  • 記錄字母次數:
    • 遍歷第一個字串,記錄每個字母的次數
  • 檢查字母次數:
    • 遍歷第二個字串,檢查每個字母的次數
  • 返回結果:
    • 如果所有字母的次數都匹配,返回 true

例子說明
#

s = "anagram", t = "nagaram"

步驟 字母 map內容 操作
初始化 - {} 創建空的HashMap
記錄s a {a:1} a次數+1
n {a:1, n:1} n次數+1
a {a:2, n:1} a次數+1
g {a:2, n:1, g:1} g次數+1
r {a:2, n:1, g:1, r:1} r次數+1
a {a:3, n:1, g:1, r:1} a次數+1
m {a:3, n:1, g:1, r:1, m:1} m次數+1
檢查t n {a:3, n:0, g:1, r:1, m:1} n次數-1
a {a:2, n:0, g:1, r:1, m:1} a次數-1
g {a:2, n:0, g:0, r:1, m:1} g次數-1
a {a:1, n:0, g:0, r:1, m:1} a次數-1
r {a:1, n:0, g:0, r:0, m:1} r次數-1
a {a:0, n:0, g:0, r:0, m:1} a次數-1
m {a:0, n:0, g:0, r:0, m:0} m次數-1
最終結果 - {a:0, n:0, g:0, r:0, m:0} 返回true,所有字母次數匹配

完整程式碼
#

java
class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length()) return false;

        // 使用HashMap記錄字母次數
        Map<Character, Integer> map = new HashMap<>();

        // 記錄s中的字母次數
        for(int i = 0; i < s.length(); i++){
            map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
        }

        // 檢查t中的字母次數
        for(int i = 0; i < t.length(); i++){
            char ch = t.charAt(i);

            if(!map.containsKey(ch) || map.get(ch) == 0){
                return false;
            }

            map.put(ch, map.get(ch) - 1);
        }

        return true;
    }
}

時間複雜度
#

  • 時間複雜度O(n),其中 n 是字串的長度,需要遍歷所有字母
  • 空間複雜度O(1),因為字母數量有限,HashMap 的大小不會超過 26

相關文章

leetcode 125 - Valid Palindrome
類別 
Leetcode
標籤 
Java Leetcode Easy String Problem Two Pointers Problem Blind75
leetcode 647 - Palindromic Substrings
類別 
Leetcode
標籤 
Java Leetcode Medium String Problem Blind75
leetcode 190 - Reverse Bits
類別 
Leetcode
標籤 
Java Leetcode Easy Bit Problem Blind75