1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| class Solution { public boolean wordPatternMatch(String pattern, String s) { return backtrack(pattern, s, 0, 0, new HashMap<>(), new HashSet<>()); }
private boolean backtrack(String pattern, String s, int patternPtr, int sPtr, Map<Character, String> letterMapping, Set<String> visited) { if (patternPtr >= pattern.length() && sPtr >= s.length()) { return true; } if (patternPtr >= pattern.length() || sPtr >= s.length()) { return false; } char currLetter = pattern.charAt(patternPtr); if (letterMapping.containsKey(currLetter)) { String targetWord = letterMapping.get(currLetter); if (targetWord.length() > (s.length() - sPtr) || !targetWord.equals(s.substring(sPtr, sPtr + targetWord.length()))) { return false; } else { return backtrack(pattern, s, patternPtr + 1, sPtr + targetWord.length(), letterMapping, visited); } } else { for (int i = sPtr + 1; i <= s.length(); i++) { String currWord = s.substring(sPtr, i); if (!visited.contains(currWord)) { visited.add(currWord); letterMapping.put(currLetter, currWord); if (backtrack(pattern, s, patternPtr + 1, sPtr + currWord.length(), letterMapping, visited)) { return true; } letterMapping.remove(currLetter); visited.remove(currWord); } } } return false; } }
|