Given a pattern
and a string s
, find if s
follows the same pattern.
Here follow means a full match, such that there is a bijection between a letter in pattern
and a non-empty word in s
.
Example 1:Input: pattern = “abba”, s = “dog cat cat dog” Output: true
Example 2:Input: pattern = “abba”, s = “dog cat cat fish” Output: false
Example 3:Input: pattern = “aaaa”, s = “dog cat cat dog” Output: false
Constraints:
1 <= pattern.length <= 300
pattern
contains only lower-case English letters.1 <= s.length <= 3000
s
contains only lowercase English letters and spaces' '
.s
does not contain any leading or trailing spaces.- All the words in
s
are separated by a single space.
The idea is easy, but need to be aware of edge cases.
class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
check_dict = {}
reversed_check_dict = {}
words = s.split(" ")
if len(words) != len(pattern):
return False
for character, word in zip(pattern, words):
preserved = check_dict.get(character)
if preserved is None and reversed_check_dict.get(word) is None:
check_dict[character] = word
reversed_check_dict[word] = character
elif preserved != word:
return False
return True
The other way to use a single hashmap. The trick is finding key in dict or set by leveraging “in” keyword in Python is O(1) complexity. If it’s in a list, like dict.values(), then the time complexity is O(n)
class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
check_dict = {}
words = s.split(" ")
if len(words) != len(pattern):
return False
for character, word in zip(pattern, words):
preserved = check_dict.get(character)
if character not in check_dict and word not in check_dict.values():
check_dict[character] = word
elif check_dict.get(character) != word:
return False
return True
搶先發佈留言