Similar to merging 2 arrays, run 3 pointers in a,b and c.
Use HashMap to store intermediate results
int getCount(String a, String b, String c) {
return merge(a.toCharArray(), 0, b.toCharArray(), 0, c.toCharArray(), 0, new HashMap<>());
}
int merge(char[] a, int i, char[] b, int j, char c[], int k, Map<String, Integer> map) {
if (k >= c.length) return 1;
if (i >= a.length && j >= b.length)
return 0;
String key = i + "," + j + "," + k;
if (map.containsKey(key)) {
return map.get(key);
}
int count = 0;
// Matches with character in a
if (i<a.length && a[i] == c[k])
count += merge(a, i+1, b, j, c, k+1, map);
// Matches with character in b
if (j<b.length && b[j] == c[k])
count += merge(a, i, b, j+1, c, k+1, map);
// Matches with neither a or b
count += merge(a,i+1,b,j+1,c,k, map);
map.put(key, count);
return count;
}