# 0291. Word Pattern II ###### tags: `Leetcode` `Medium` `Backtracking` Link: https://leetcode.com/problems/word-pattern-ii/ ## 思路 用map存当下路径的pattern 用set保证两个字母不会对到同一个字符串 在backtracking的递归函数里面一旦往map或者set里加任何东西 一定要在递归之后把它从里面删掉 ## Code ```java= class Solution { public boolean wordPatternMatch(String pattern, String s) { Map<Character, String> map = new HashMap<>(); //to avoid use both 'a' and 'b' to represent same string Set<String> set = new HashSet<>(); return dfs(pattern, s, 0, 0, map, set); } private boolean dfs(String pattern, String s, int p1, int p2, Map<Character, String> map, Set<String> set){ if(p1==pattern.length() && p2==s.length()) return true; if(p1>=pattern.length() || p2>=s.length()) return false; if(map.containsKey(pattern.charAt(p1))){ String p = map.get(pattern.charAt(p1)); for(int i=0; i<p.length();i++){ if(p2+i>=s.length() || s.charAt(p2+i)!=p.charAt(i)) return false; } return dfs(pattern, s, p1+1, p2+p.length(), map, set); } else{ for(int i=p2; i<s.length(); i++){ String newStr = s.substring(p2, i+1); if(set.contains(newStr)) continue; map.put(pattern.charAt(p1), newStr); set.add(newStr); if(dfs(pattern, s, p1+1, i+1, map, set)) return true; set.remove(newStr); map.remove(pattern.charAt(p1)); } } return false; } } ```