You are given two strings, pattern and value. The pattern string consists of just the letters a and b, describing a pattern within a string. For example, the string catcatgocatgo matches the pattern aabab (where cat is a and go is b). It also matches patterns like a, ab, and b. Write a method to determine if value matches pattern. a and b cannot be the same string.
Example 1:
Input: pattern = "abba", value = "dogcatcatdog"
Output: true
Example 2:
Input: pattern = "abba", value = "dogcatcatfish"
Output: false
Example 3:
Input: pattern = "aaaa", value = "dogcatcatdog"
Output: false
pattern only contains "a" and "b", value only contains lowercase letters.
Solutions
Solution 1: Enumeration
Thinking
a and b each stand for a (possibly empty) string. Searching the product of their contents is huge.
Once the two lengths are fixed, the match is determined; it remains to check consistency and \(a\ne b\).
Handle a single-letter pattern first. Enumerate \(la\), deduce \(lb\) from the total length, and check slices along the pattern. Both the enum and each check are linear.
We first count the number of characters 'a' and 'b' in the pattern string \(pattern\), denoted as \(cnt[0]\) and \(cnt[1]\), respectively. Let the length of the string \(value\) be \(n\).
If \(cnt[0]=0\), it means that the pattern string only contains the character 'b'. We need to check whether \(n\) is a multiple of \(cnt[1]\), and whether \(value\) can be divided into \(cnt[1]\) substrings of length \(n/cnt[1]\), and all these substrings are the same. If not, return \(false\) directly.
If \(cnt[1]=0\), it means that the pattern string only contains the character 'a'. We need to check whether \(n\) is a multiple of \(cnt[0]\), and whether \(value\) can be divided into \(cnt[0]\) substrings of length \(n/cnt[0]\), and all these substrings are the same. If not, return \(false\) directly.
Next, we denote the length of the string matched by the character 'a' as \(la\), and the length of the string matched by the character 'b' as \(lb\). Then we have \(la \times cnt[0] + lb \times cnt[1] = n\). If we enumerate \(la\), we can determine the value of \(lb\). Therefore, we can enumerate \(la\) and check whether there exists an integer \(lb\) that satisfies the above equation.
The time complexity is \(O(n^2)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the string \(value\).