import java.util.*;
class Subsequence2Pointer {
int n = a.length();
int m = b.length();
// If b has only one character,
// removing it leaves empty string,
// which is always a subsequence.
if (m == 1) {
return 1;
}
int[] left = new int[m];
int[] right = new int[m];
// Build left[]
// left[i] = earliest position in a
// where b[0...i] can be matched.
int j = 0;
for (int i = 0; i < n && j < m; i++) {
if (a.charAt(i) == b.charAt(j)) {
left[j] = i;
j++;
}
}
// Build right[]
// right[i] = latest position in a
// where b[i...m-1] can be matched.
j = m - 1;
for (int i = n - 1; i >= 0 && j >= 0; i--) {
if (a.charAt(i) == b.charAt(j)) {
right[j] = i;
j--;
}
}
// if an index is supposed to be good then left[i-1] < right[i+1]
// meaning index i-1 in b was found at left[i-1] and occurs before right[i+1] occurance
//
int good = 0;
for (int i = 0; i < m; i++) {
int l = (i == 0) ? -1 : left[i - 1];
int r = (i == m - 1) ? n : right[i + 1];
boolean prefixOk = (i == 0) || (l != -1);
boolean suffixOk = (i == m - 1) || (r != -1);
if (prefixOk && suffixOk && l < r) {
good++;
}
}
return good;
}
public static void main
(String[] args
) { //"If b itself is already a subsequence of a, then removing any character from b should still give a subsequence."
// if not subsequence then IFF we have one char somewhere that needs to be removed then thats the ans..
// so either ans is 1 or length of string or 0 if not possible at all
System.
out.
println(numOfGoodIndices
(a, b
)); System.
out.
println(numOfGoodIndices
("abc",
"xy")); System.
out.
println(numOfGoodIndices
("abcd",
"ayd")); }
}
aW1wb3J0IGphdmEudXRpbC4qOwpjbGFzcyBTdWJzZXF1ZW5jZTJQb2ludGVyIHsKCiAgICBwdWJsaWMgc3RhdGljIGludCBudW1PZkdvb2RJbmRpY2VzKFN0cmluZyBhLCBTdHJpbmcgYikgewoKICAgICAgICBpbnQgbiA9IGEubGVuZ3RoKCk7CiAgICAgICAgaW50IG0gPSBiLmxlbmd0aCgpOwoKICAgICAgICAvLyBJZiBiIGhhcyBvbmx5IG9uZSBjaGFyYWN0ZXIsCiAgICAgICAgLy8gcmVtb3ZpbmcgaXQgbGVhdmVzIGVtcHR5IHN0cmluZywKICAgICAgICAvLyB3aGljaCBpcyBhbHdheXMgYSBzdWJzZXF1ZW5jZS4KICAgICAgICBpZiAobSA9PSAxKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KCiAgICAgICAgaW50W10gbGVmdCA9IG5ldyBpbnRbbV07CiAgICAgICAgaW50W10gcmlnaHQgPSBuZXcgaW50W21dOwoKICAgICAgICBBcnJheXMuZmlsbChsZWZ0LCAtMSk7CiAgICAgICAgQXJyYXlzLmZpbGwocmlnaHQsIC0xKTsKCiAgICAgICAgLy8gQnVpbGQgbGVmdFtdCiAgICAgICAgLy8gbGVmdFtpXSA9IGVhcmxpZXN0IHBvc2l0aW9uIGluIGEKICAgICAgICAvLyB3aGVyZSBiWzAuLi5pXSBjYW4gYmUgbWF0Y2hlZC4KICAgICAgICBpbnQgaiA9IDA7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbiAmJiBqIDwgbTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhLmNoYXJBdChpKSA9PSBiLmNoYXJBdChqKSkgewogICAgICAgICAgICAgICAgbGVmdFtqXSA9IGk7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEJ1aWxkIHJpZ2h0W10KICAgICAgICAvLyByaWdodFtpXSA9IGxhdGVzdCBwb3NpdGlvbiBpbiBhCiAgICAgICAgLy8gd2hlcmUgYltpLi4ubS0xXSBjYW4gYmUgbWF0Y2hlZC4KICAgICAgICBqID0gbSAtIDE7CgogICAgICAgIGZvciAoaW50IGkgPSBuIC0gMTsgaSA+PSAwICYmIGogPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIGlmIChhLmNoYXJBdChpKSA9PSBiLmNoYXJBdChqKSkgewogICAgICAgICAgICAgICAgcmlnaHRbal0gPSBpOwogICAgICAgICAgICAgICAgai0tOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBpZiBhbiBpbmRleCBpcyBzdXBwb3NlZCB0byBiZSBnb29kIHRoZW4gbGVmdFtpLTFdIDwgcmlnaHRbaSsxXQogICAgICAgIC8vIG1lYW5pbmcgaW5kZXggaS0xIGluIGIgd2FzIGZvdW5kIGF0IGxlZnRbaS0xXSBhbmQgb2NjdXJzIGJlZm9yZSByaWdodFtpKzFdIG9jY3VyYW5jZSAKICAgICAgICAvLyAKCiAgICAgICAgaW50IGdvb2QgPSAwOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgIAlpbnQgbCA9IChpID09IDApID8gLTEgOiBsZWZ0W2kgLSAxXTsKICAgICAgICAJaW50IHIgPSAoaSA9PSBtIC0gMSkgPyBuIDogcmlnaHRbaSArIDFdOwogICAgICAgIAlib29sZWFuIHByZWZpeE9rID0gKGkgPT0gMCkgfHwgKGwgIT0gLTEpOwogICAgICAgIAlib29sZWFuIHN1ZmZpeE9rID0gKGkgPT0gbSAtIDEpIHx8IChyICE9IC0xKTsKICAgICAgICAJaWYgKHByZWZpeE9rICYmIHN1ZmZpeE9rICYmIGwgPCByKSB7CiAgICAgICAgCQlnb29kKys7CiAgICAgICAgCX0KICAgICAgICB9CgogICAgICAgIHJldHVybiBnb29kOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAvLyJJZiBiIGl0c2VsZiBpcyBhbHJlYWR5IGEgc3Vic2VxdWVuY2Ugb2YgYSwgdGhlbiByZW1vdmluZyBhbnkgY2hhcmFjdGVyIGZyb20gYiBzaG91bGQgc3RpbGwgZ2l2ZSBhIHN1YnNlcXVlbmNlLiIKICAgICAgICAvLyBpZiBub3Qgc3Vic2VxdWVuY2UgdGhlbiBJRkYgd2UgaGF2ZSBvbmUgY2hhciBzb21ld2hlcmUgdGhhdCBuZWVkcyB0byBiZSByZW1vdmVkIHRoZW4gdGhhdHMgdGhlIGFucy4uIAogICAgICAgIC8vIHNvIGVpdGhlciBhbnMgaXMgMSBvciBsZW5ndGggb2Ygc3RyaW5nIG9yIDAgaWYgbm90IHBvc3NpYmxlIGF0IGFsbAogICAgICAgIFN0cmluZyBhID0gImFieGNkeWVmIjsKICAgICAgICBTdHJpbmcgYiA9ICJhYmNkZSI7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihudW1PZkdvb2RJbmRpY2VzKGEsIGIpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obnVtT2ZHb29kSW5kaWNlcygiYWJjIiwgInh5IikpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihudW1PZkdvb2RJbmRpY2VzKCJhYmNkIiwgImF5ZCIpKTsKICAgIH0KfQ==