自己寫的,好像有點複雜:
class Solution: def wordPattern(self, pattern: str, s: str) -> bool: # 將字串 s 按空格切分成單詞列表 mystr = s.split() # 建立一個空字典,用於儲存字元和其出現位置的對映 mydic = dict() # 將單詞列表轉換為集合,以便檢查單詞是否唯一 mystr_set = set(mystr) # 檢查模式字串和單詞列表的長度是否相同,如果不同,則返回 False if len(mystr) != len(pattern): return False # 遍歷模式字串的每個字元 for index, char in enumerate(pattern): # 如果當前字元不在字典中,將其新增到字典並將其位置作為值 if char not in mydic: mydic.update({char: [index]}) else: # 如果當前字元已經在字典中,將其位置新增到對應字元的值列表中 mydic[char].append(index) # 檢查字典中不同值的數量是否與單詞集合的長度相同,如果不同,則返回 False if len(mydic) != len(mystr_set): return False # 檢查每個字元在單詞列表中的位置是否一致 for k, value_list in mydic.items(): for i in value_list: # 如果當前位置的單詞與該字元的第一個位置的單詞不同,則返回 False if mystr[i] == mystr[value_list[0]]: continue else: return False # 如果所有檢查都透過,則返回 True return True
gpt最佳化:檢查雙向的對映關係
class Solution: def wordPattern(self, pattern: str, s: str) -> bool: # 將字串 s 按空格切分成單詞列表 words = s.split() # 如果單詞數量與模式字元數量不一致,則返回 False if len(words) != len(pattern): return False # 建立兩個空字典,用於儲存模式字元到單詞和單詞到模式字元的對映關係 pattern_to_word = {} word_to_pattern = {} # 遍歷模式字串和單詞列表 for char, word in zip(pattern, words): # 檢查模式字元到單詞的對映關係 if char not in pattern_to_word: pattern_to_word[char] = word else: # 如果模式字元已經存在於對映中,檢查是否對應相同的單詞,若不同則返回 False if pattern_to_word[char] != word: return False # 檢查單詞到模式字元的對映關係 if word not in word_to_pattern: word_to_pattern[word] = char else: # 如果單詞已經存在於對映中,檢查是否對應相同的模式字元,若不同則返回 False if word_to_pattern[word] != char: return False # 如果所有對映關係都一致,則返回 True return True