package com.interview.recursion;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Given a pattern and a string str, find if str follows the same pattern.
Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty substring in str.
* https://leetcode.com/problems/word-pattern-ii/
*/
public class WordPattern {
public boolean wordPatternMatch(String pattern, String str) {
Map<Character, String> map = new HashMap<>();
Set<String> set = new HashSet<>();
return wordPatternMatch(pattern, str, 0, 0, map, set);
}
public boolean wordPatternMatch(String pattern, String str, int pos1, int pos2, Map<Character, String> map, Set<String> set) {
if (pos1 == pattern.length()) {
return pos2 == str.length();
}
char ch = pattern.charAt(pos1);
String val = map.get(ch);
if (val != null) {
return pos2 + val.length() <= str.length() && val.equals(str.substring(pos2, pos2 + val.length())) && wordPatternMatch(pattern, str, pos1 + 1, pos2 + val.length(), map, set);
} else {
for (int i = pos2; i < str.length() - (pattern.length() - pos1 - 1); i++) {
String newStr = str.substring(pos2, i + 1);
if (set.contains(newStr)) {
continue;
}
set.add(newStr);
map.put(ch, newStr);
if (wordPatternMatch(pattern, str, pos1 + 1, i + 1, map, set)) {
return true;
}
set.remove(newStr);
}
map.remove(ch);
}
return false;
}
public static void main(String args[]) {
String pattern = "abcbc";
String str = "bcdgflgfl";
WordPattern wp = new WordPattern();
System.out.println(wp.wordPatternMatch(pattern, str));
}
}