291. Word Pattern II
discuss里面这个写法实在写的太逻辑清晰了, 一看就懂
https://discuss.leetcode.com/topic/26750/share-my-java-backtracking-solution
一看Helper的签名就能做了哈哈
helper的含义是
1 如果刚好pattern和str都同时到达了尽头,说明匹配上了,返回true 2 3 如果两个中只有一个到达了尽头,说明没有匹配上,返回false 4 5 如果在map里面已经有目前这个pattern字母对应的str串 6 7 那么如果当前的str并不以那个开头,说明就没有匹配上返回false 8 否则就返回helper(str, i往前移动当前字母小pattern的长度,pattern, j往前一格,map, set) 9 否则 10 11 就对从目前为止开始的str开始,试所有可能的长度的str和当前的pattern对应 12 如果这个小str已经被匹配给某个pattern字母了,返回false 13 在set和map里加入目前的组合 14 如果递归发现匹配上了,就返回true 15 不然就从set和map里面把当前组合移除 16 返回false(因为试了目前str所有的情况试图和当前的pattern字母匹配)
代码如下:
1 public boolean wordPatternMatch(String pattern, String str) { 2 if(pattern == null || str == null) { 3 return false; 4 } 5 Map<Character, String> map = new HashMap<>(); 6 Set<String> set = new HashSet<>(); 7 return match(str, 0, pattern, 0, map, set); 8 } 9 10 private boolean match(String str, int i, String pattern, int j, Map<Character, String> map, Set<String> set) { 11 if(i == str.length() && j == pattern.length()) { 12 return true; 13 } 14 if(i == str.length() || j == pattern.length()) { 15 return false; 16 } 17 char c = pattern.charAt(j); 18 if(map.containsKey(c)) { 19 String pat = map.get(c); 20 if(!str.startsWith(pat, i)) { 21 return false; 22 } 23 return match(str, i + pat.length(), pattern, j + 1, map, set); 24 } else { 25 for(int k = i; k < str.length(); k++) { 26 String pat = str.substring(i, k + 1); 27 if(set.contains(pat)) { 28 continue; 29 } 30 map.put(c, pat); 31 set.add(pat); 32 if(match(str, i + pat.length(), pattern, j + 1, map, set)) { 33 return true; 34 } 35 map.remove(c); 36 set.remove(pat); 37 } 38 return false; 39 } 40 }