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。

相关推荐
YGGP28 分钟前
【Golang】LeetCode 72. 编辑距离
算法·leetcode
YGGP36 分钟前
【Golang】LeetCode 62. 不同路径
算法·leetcode
努力学算法的蒟蒻1 小时前
day47(12.28)——leetcode面试经典150
算法·leetcode·面试
iAkuya3 小时前
(leetcode)力扣100 26环状链表2(双指针)
算法·leetcode·链表
sin_hielo3 小时前
leetcode 2402(双堆模拟,小根堆)
数据结构·算法·leetcode
Morwit3 小时前
【力扣hot100】 312. 戳气球(区间dp)
c++·算法·leetcode
Q741_1473 小时前
C++ 栈 模拟 力扣 394. 字符串解码 每日一题 题解
c++·算法·leetcode·模拟·
Wuliwuliii3 小时前
闵可夫斯基和、需存储的最小状态集
c++·算法·动态规划·闵可夫斯基和
byzh_rc3 小时前
[算法设计与分析-从入门到入土] 贪心算法
算法·动态规划
雪花desu4 小时前
【Hot100-Java简单】:两数之和 (Two Sum) —— 从暴力枚举到哈希表的思维跃迁
java·数据结构·算法·leetcode·哈希表