此为历史版本和 IPFS 入口查阅区,回到作品页
為自己Coding
IPFS 指纹 这是什么

作品指纹

LeetCode學習筆記 - 如何開始使用LeetCode刷題 - LeetCode 第242題 - Valid Anagram 解法

為自己Coding
·
·
台灣加油!! 防疫期間, LeetCode刷起來!!

Github連結

攝影師:Jeremy Bishop,連結:Pexels



1. 題目



說明: 給予兩組字符串s和t,當s裡面的擁有的單字和數量與t是一樣的,只是位置可能調換了,就會返回True,否則返回False


2. 解法


方法一: hash table

說明: 記錄好兩組字符串中的所有單字的次數,並存成Python字典(Hash Table 用法),然後比較即可

執行步驟:

首先: 可以先檢查兩組字串是否等長,如果沒有,表示一定不會是,就直接回傳False

接著: 依序將字母和其出現次數記錄於字典之中

如何進行: 預設為0,然後當s有的字母就+1,t有的時候就-1

結果: 如果計數最後為0表示返回True

def isAnagram(s, t):
  ## 判斷字串長度是否一樣
  if len(s) != len(t):
    return False
  ## 創建一個用來記錄次數的字典
  c_d = {}
  
  ## 將s中所有的元素裝入字典並計算次數,由於c_d一開始裡面並不會有任何key值,如果直接+1會報錯,所以使用.get先創建一個
  ## 然後賦值為0,接著再+1
  for c in s:
    c_d[c] = c_d.get(c, 0) + 1
#  print(c_d)
  
  ## 將t中所有元素取出,並到c_t中找尋對應有的key,將其值減一
  ## 如果元素根本沒有出現在c_t的key中,表示s中沒有此元素,直接回傳False
  ## 如果c_t中已經把這個元素的計數扣到0了,然後t還有還要繼續扣,也直接回傳False
  for c in t:
    if (c not in c_d) or (c_d[c] == 0):
      return False
    else:
      c_d[c] -=1
#    print(c_d)
  return True
  
isAnagram('elephants', 'aestnhple')  

執行結果

True


方法二: sorted

說明: 只要將兩組字符串重新排序,整個字符串就會依a~z的順序排好,同樣的字母就會排在一起,兩組字串都被重新排序,這樣就可以知道它們是否完全一樣了

def isAnagram(s, t):
  ## 判斷字串長度是否一樣
  if len(s) != len(t):
    return False
  ## 返回經過排序過後的s和t是否一樣
  return sorted(s) == sorted(t)
isAnagram('elephants', 'aestnhple') 

執行結果

True

我在LeetCode上面執行,方法二的執行速度較方法一來得快喔!!



方法三: Counter

def isAnagram(s, t):
  from collections import Counter
#  print(Counter(s))
#  print(Counter(t))
  return Counter(s) == Counter(t)
isAnagram('elephants', 'aestnhple')

執行結果

True



結果發現第三種方法跑起來更快xd

CC BY-NC-ND 2.0 授权