首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。