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
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\).