Given a pattern and a string s, return true if smatches the pattern.
A string smatches a pattern if there is some bijective mapping of single characters to non-empty strings such that if each character in pattern is replaced by the string it maps to, then the resulting string is s. A bijective mapping means that no two characters map to the same string, and no character maps to two different strings.
Example 1:
Input: pattern = "abab", s = "redblueredblue"
Output: true
Explanation: One possible mapping is as follows:
'a' -> "red"
'b' -> "blue"
Example 2:
Input: pattern = "aaaa", s = "asdasdasdasd"
Output: true
Explanation: One possible mapping is as follows:
'a' -> "asd"
Example 3:
Input: pattern = "aabb", s = "xyzabcxzyabc"
Output: false
Constraints:
1 <= pattern.length, s.length <= 20
pattern and s consist of only lowercase English letters.
Solutions
Solution 1
Thinking
A pattern character may match a substring of any length, so we cannot split on spaces. We enumerate those substrings under a bijection.
\(dfs(i,j)\) tries \(s[j..k]\) for \(pattern[i]\): reuse an existing mapping if it matches, otherwise bind an unused substring and backtrack on failure.