291 word pattern II
https://leetcode.com/problems/word-pattern-ii/
太难写对了
class Solution {
public boolean wordPatternMatch(String pattern, String s) {
Map<Character, String> map = new HashMap<>();
Map<String, Character> seen = new HashMap<>();
//注意是s.length不是pattern.length
return match(pattern.toCharArray(), 0, 0, s.length(), s, map, seen);
}
private boolean match(char[] pattern, int index, int start, int end, String s,
Map<Character, String> map, Map<String, Character> seen) {
// 防止字母都match完了s还没到头
if (index == pattern.length) return start == end;
char ch = pattern[index];
if (map.containsKey(ch)) {
String sub = s.substring(start, end);
if (map.get(ch).equals(sub)){
// 防止字母还没match完,s就到头了
return index == pattern.length - 1;
} else {
// startsWith是个好东西!!!!!
if (sub.startsWith(map.get(ch))) {
return match(pattern, index + 1,
start + map.get(ch).length(), end, s, map, seen);
}
return false;
}
}
for (int i = start; i < end; i++) {
String sub = s.substring(start, i + 1);
//防止两个ch对应了同样的substring
if (seen.get(sub) != null && seen.get(sub) != ch) continue;
map.put(ch, sub);
seen.put(sub, ch);
if (match(pattern, index + 1, i + 1, end, s, map, seen)) return true;
// 两个都要吐出来!!!!
// 否则的话可能会有深层次的递归遇到同样的ch加一些奇怪的东西在map里
seen.remove(sub);
map.remove(ch);
}
return false;
}
}
Last updated