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 pattern maps to exactly one unique word in s.
Each unique word in s maps to exactly one letter in pattern.
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 <= 300
pattern contains only lower-case English letters.
1 <= s.length <= 3000
s contains only lowercase English letters and spaces ' '.
sdoes not contain any leading or trailing spaces.
All the words in s are separated by a single space.
Solutions
Solution 1: Hash Table
Thinking
The pattern and the words must be bijections; unequal lengths fail. As with isomorphic strings, two maps record char-to-word and word-to-char.
A conflict with an existing mapping fails.
First, we split the string \(s\) into a word array \(ws\) with spaces. If the length of \(pattern\) and \(ws\) is not equal, return false directly. Otherwise, we use two hash tables \(d_1\) and \(d_2\) to record the correspondence between each character and word in \(pattern\) and \(ws\).
Then, we traverse \(pattern\) and \(ws\). For each character \(a\) and word \(b\), if there is a mapping for \(a\) in \(d_1\), and the mapped word is not \(b\), or there is a mapping for \(b\) in \(d_2\), and the mapped character is not \(a\), return false. Otherwise, we add the mapping of \(a\) and \(b\) to \(d_1\) and \(d_2\) respectively.
After the traversal, return true.
The time complexity is \(O(m + n)\) and the space complexity is \(O(m + n)\). Here \(m\) and \(n\) are the length of \(pattern\) and string \(s\).
The two maps can be replaced by checking that the number of distinct pattern characters equals the number of distinct words, then keeping a one-way map.