Word Pattern
Problem
https://leetcode.com/problems/word-pattern/
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.
Specifically:
Each letter in
patternmaps to exactly one unique word ins.Each unique word in
smaps to exactly one letter inpattern.No two letters map to the same word, and no two words map to the same letter.
Example 1:
Input: pattern = “abba”, s = “dog cat cat dog”
Output: true
Explanation:
The bijection can be established as:
'a'maps to"dog".'b'maps to"cat".
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 <= 300patterncontains only lower-case English letters.1 <= s.length <= 3000scontains only lowercase English letters and spaces' '.sdoes not contain any leading or trailing spaces.All the words in
sare separated by a single space.
Pattern
Hash Table, String
Approaches
Explanation
Split s into a list of words. The problem reduces to IsomorphicStrings but
with characters in pattern and elements in s. Since pattern and
s can have different lenghts, we first check that they have the same
length.
Code
def wordPattern(pattern: str, s: str) -> bool:
"""Given a pattern and a string ``s``, finds if ``s`` follows the same pattern."""
words = s.split()
if len(pattern) != len(words):
return False
d = {}
d_range = set()
for char, word in zip(pattern, words):
if char in d:
if d[char] != word:
return False
else:
if word in d_range:
return False
else:
d[char] = word
d_range.add(word)
return True
Test
>>> from word_pattern__hash_map import wordPattern
>>> wordPattern('abba', 'dog cat cat dog')
True
>>> wordPattern('abba', 'dog cat cat fish')
False
>>> wordPattern('aaaa', 'dog cat cat dog')
False
Complexity
\(n\) is the length of pattern and the number of words in s
Measure |
Complexity |
Notes |
|---|---|---|
Time |
\(O(n)\) |
single pass over |
Auxiliary Space |
\(O(n)\) |
dictionary for mapping characters to words and set for tracking mapped words |
- word_pattern__hash_map.wordPattern(pattern: str, s: str) bool
Given a pattern and a string
s, finds ifsfollows the same pattern.