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     }

 

posted @ 2016-10-15 05:42  warmland  阅读(406)  评论(0编辑  收藏  举报