1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
public boolean wordPatternMatch(String pattern, String s) {
return backtrack(pattern, s, 0, 0, new HashMap<>(), new HashSet<>());
}

private boolean backtrack(String pattern, String s, int patternPtr, int sPtr, Map<Character, String> letterMapping,
Set<String> visited) {
if (patternPtr >= pattern.length() && sPtr >= s.length()) {
return true;
}
if (patternPtr >= pattern.length() || sPtr >= s.length()) {
return false;
}
char currLetter = pattern.charAt(patternPtr);
if (letterMapping.containsKey(currLetter)) {
String targetWord = letterMapping.get(currLetter);
if (targetWord.length() > (s.length() - sPtr)
|| !targetWord.equals(s.substring(sPtr, sPtr + targetWord.length()))) {
return false;
} else {
return backtrack(pattern, s, patternPtr + 1, sPtr + targetWord.length(), letterMapping, visited);
}
} else {
for (int i = sPtr + 1; i <= s.length(); i++) {
String currWord = s.substring(sPtr, i);
if (!visited.contains(currWord)) {
visited.add(currWord);
letterMapping.put(currLetter, currWord);
if (backtrack(pattern, s, patternPtr + 1, sPtr + currWord.length(), letterMapping, visited)) {
return true;
}
letterMapping.remove(currLetter);
visited.remove(currWord);
}
}
}
return false;
}
}

首先需要知道一个letter匹配哪个word, 于是要有一个hashset. 其次我们还要保证一个word不能map到多个不同的letter, 于是我们需要用hashset来记录被匹配过的word. 接下来就是backtrack了. 一个letter可能匹配的word的长度为1, 2, 3…

时间复杂度和空间复杂度不知道怎么算.