[
dp
two pointers
accumulate
]
BinarySearch 0208 Maximum Removal Subsequence String
Problem statement
https://binarysearch.com/problems/Maximum-Removal-Subsequence-String/
Solution
Let us apply algorithm where we checked that t is subsequence of s, but now we keep places as well. For example if s = xaababcbac and t = abac, we have places 1, 3, 4, 6. Do the same logic from the end - for reversed strings: here it will be 0, 1, 2, 5, after normalization it is 9, 8, 7, 4. Then Imagine that we take 1 element from start and 3 from end, then we have 1 index where prefix ends and 8 index where suffix starts, so gap is 6. We do it for all pairs.
Complexity
It is O(n) for time and space.
Code
class Solution:
def solve(self, s, t):
def isSubsequence(s, t):
si, ti, ans = 0, 0, []
while si < len(s) and ti < len(t):
if s[si] == t[ti]:
ans += [ti]
si, ti = si + (s[si] == t[ti]), ti + 1
return ans
n = len(s)
a1 = isSubsequence(t, s)
a2 = isSubsequence(t[::-1], s[::-1])
ans = n - 1 - min(a1[-1], a2[-1])
for x, y in zip(a1, a2[::-1][1:]):
ans = max(ans, n - 2 - y - x)
return ans