- [Leetcode 3316. Find Maximum Removals From Source String](#Leetcode 3316. Find Maximum Removals From Source String)
- [1. 解题思路](#1. 解题思路)
- [2. 代码实现](#2. 代码实现)
1. 解题思路
这一题思路上的话就是一个动态规划的题目,我们仿照lcs,考察每一个位置是否可以drop即可。
而关于lcs算法,网上有很多介绍文章,这里就不过多赘述了。
2. 代码实现
给出python代码实现如下:
python
class Solution:
def maxRemovals(self, source: str, pattern: str, targetIndices: List[int]) -> int:
n, m = len(source), len(pattern)
targets = set(targetIndices)
@lru_cache(None)
def dp(i, j):
if j >= m:
return len([idx for idx in range(i, n) if idx in targets])
if i >= n:
return -math.inf
if i in targets:
if source[i] == pattern[j]:
return max(dp(i+1, j+1), 1 + dp(i+1, j))
else:
return 1 + dp(i+1, j)
else:
if source[i] == pattern[j]:
return dp(i+1, j+1)
else:
return dp(i+1, j)
remove = dp(0, 0)
return remove if remove != -math.inf else 0
提交代码评测得到:耗时2217ms,占用内存725MB。