0242. Valid Anagram - chasel2361/leetcode GitHub Wiki

Given two strings s and t , write a function to determine if t is an anagram of s.

Example 1:
Input: s = "anagram", t = "nagaram"
Output: true

Example 2:
Input: s = "rat", t = "car"
Output: false

Note:
You may assume the string contains only lowercase alphabets.
Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?

這題的目標是檢驗給定的兩個 string 是否由同樣的字母組成,這個問題仍然可以利用 Counter 來解決。

先把 s, t 都轉換成 dict 之後,先檢查 t 的 key 值是否存在於 s 中,再利用 dict.pop() 檢查相對應的 value 是否相同。由於 pop 函式會刪除已取出的物件,檢查完 t 之後只要看 s 中是否還有值就可得知 s 中是否有 t 不存在的字母,寫為程式碼如下

from collections import Counter
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        s = Counter(s)
        t = Counter(t)
        for key, value in t.items():
            if key not in s.keys() or value != s.pop(key):
                return False
        if len(s.keys()) > 0:
            return False
        return True

這樣寫的時間複雜度是 O(N), 空間複雜度為 O(1)

後來研究了一下如果不使用 Counter 要怎麼解,發現其實可以先把 s 丟進 dict 裡,在檢驗 t 是否與 dict 相符即可

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        dic = {}
        for i in s:
            if i not in dic:
                dic[i] = 1
            else:
                dic[i] += 1

        for j in t:
            if j not in dic:
                return False
            else:
                dic[j] -= 1
        
        for value in dic.values():
            if value != 0:
                return False
                
        return True

這樣寫的時間複雜度是 O(N),空間複雜度也是 O(1)

寫完之後發現 Counter 可以更簡短,因為 dict 可以直接互相比較內含的 key, value 是否相同,這樣只要一行就可以解決

from collections import Counter
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        return Counter(s) == Counter(t)