https://leetcode.com/problems/word-pattern-ii/description/

image.png
这道题因为就是PATTERN的一个字母可以对应一个STRING,我们可以用枚举然后回溯看有没有可能的解。
举个例子
pattern = "abab", str = "redblueredblue"
先拿a映射r,b映射e,来了一个出现过的字母,就看后面的东西是不是和A映射的R是一致的。如果不一致,就回溯,说明B映射E不可行。那么B映射ED行不行呢?以此类推。
这里正过来要对应,反过来也要对应。比如A映射E,那么B就不能也映射到E。所以我们还需要检查一个新字符要去映射的时候,从后面取的,有没有被前面的其他字符映射过。如果映射过,要CONTINUE这个可能性。
代码如下:
Map<Character,String> map = new HashMap<>();
Map<String,Character> map2 = new HashMap<>();
public boolean wordPatternMatch(String aa, String bb) {
return help(aa,0,bb,0);
}
private boolean help(String aa, int i, String bb, int j) {
if(i == aa.length()){
return j == bb.length();
}
char c = aa.charAt(i);
if(map.containsKey(c)){
if(bb.startsWith(map.get(c), j)){
return help(aa,i+1,bb,j+map.get(c).length());
}
return false;
}else{
for(int k = j+1; k <= bb.length(); k++){
String cur = bb.substring(j,k);
if(map2.containsKey(cur)) continue;
map.put(c, cur);
map2.put(cur, c);
if(help(aa,i+1,bb,k)) return true;
map2.remove(cur);
}
map.remove(c);
}
return false;
}