291. Word Pattern II
Given a pattern
and a string s
, return true
if s
matches the pattern
.
A string s
matches a pattern
if there is some bijective mapping of single characters to 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
ands
consist of only lowercase English letters.
Solution:
https://www.jiuzhang.com/problem/word-pattern-ii/
public class Solution {
/**
* @param pattern: a string,denote pattern string
* @param str: a string, denote matching string
* @return: a boolean
*/
public boolean wordPatternMatch(String pattern, String str) {
Map<Character, String> map = new HashMap<>();
Set<String> set = new HashSet<>();
return match(pattern, str, map, set);
}
private boolean match(String pattern,
String str,
Map<Character, String> map,
Set<String> set) {
if (pattern.length() == 0) {
return str.length() == 0;
}
Character c = pattern.charAt(0);
if (map.containsKey(c)) {
if (!str.startsWith(map.get(c))) {
return false;
}
return match(
pattern.substring(1),
str.substring(map.get(c).length()),
map,
set
);
}
for (int i = 0; i < str.length(); i++) {
String word = str.substring(0, i + 1);
if (set.contains(word)) {
continue;
}
map.put(c, word);
set.add(word);
if (match(pattern.substring(1),
str.substring(i + 1),
map,
set)) {
return true;
}
set.remove(word);
map.remove(c);
}
return false;
}
}
Last updated
Was this helpful?