summary:
divide and conquer | memorization
package myapp.kit.leetcode.top200;
import java.util.HashMap;
import java.util.Map;
/**
*
* 97
* hard
* https://leetcode.com/problems/interleaving-string/
*
* Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
*
* Example 1:
*
* Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
* Output: true
* Example 2:
*
* Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
* Output: false
* @author huangdingsheng
* @version 1.0, 2020/7/21
*/
public class interleaving_string_97 {
private Map<String, Boolean> cache;
public boolean isInterleave(String s1, String s2, String s3) {
if (s1.length() + s2.length() != s3.length()) {
return false;
}
cache = new HashMap<>();
return search(s1, s2, s3);
}
// divide and conquer + memorization
public boolean search(String s1, String s2, String s3) {
String key = s1 + "-" + s2 + "-" + s3;
if (cache.containsKey(key)) {
return cache.get(key);
}
boolean result = false;
if (s1.length() == 0) {
result = s2.equals(s3);
} else if (s2.length() == 0) {
result = s1.equals(s3);
} else {
if (s1.charAt(s1.length() - 1) == s3.charAt(s3.length() - 1)) {
result = result || search(s1.substring(0, s1.length() - 1), s2, s3.substring(0, s3.length() - 1));
}
// pruning
if (!result) {
if (s2.charAt(s2.length() - 1) == s3.charAt(s3.length() - 1)) {
result = result || search(s1, s2.substring(0, s2.length() - 1), s3.substring(0, s3.length() - 1));
}
}
}
cache.put(key, result);
return result;
}
}