首页 > 代码库 > 291. Word Pattern II

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字母了,返回false13       在set和map里加入目前的组合14       如果递归发现匹配上了,就返回true15       不然就从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     }

 

291. Word Pattern II