Leetcode 3316. Find Maximum Removals From Source String

  • [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。

相关推荐
加农炮手Jinx4 小时前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣
加农炮手Jinx4 小时前
LeetCode 128. Longest Consecutive Sequence 题解
算法·leetcode·力扣
旖-旎4 小时前
递归(汉诺塔问题)(1)
c++·学习·算法·leetcode·深度优先·递归
JAVA学习通5 小时前
励志从零打造LeetCode平台之C端竞赛列表
java·vscode·leetcode·docker·状态模式
莫等闲-5 小时前
代码随想录一刷记录Day31——leetcode56. 合并区间 738.单调递增的数字
数据结构·c++·算法·leetcode
剑挑星河月6 小时前
45.跳跃游戏Ⅱ
数据结构·算法·leetcode
Tisfy7 小时前
LeetCode 3783.整数的镜像距离:数学
数学·算法·leetcode·题解
水蓝烟雨7 小时前
0010.三数之和
数据结构·算法·leetcode
啊哦呃咦唔鱼8 小时前
LeetCode双指针合集
算法·leetcode·职场和发展
WolfGang0073219 小时前
代码随想录算法训练营 Day37 | 动态规划 part10
算法·动态规划