列表

详情


1898. 可移除字符的最大数目

给你两个字符串 sp ,其中 ps 的一个 子序列 。同时,给你一个元素 互不相同 且下标 从 0 开始 计数的整数数组 removable ,该数组是 s 中下标的一个子集(s 的下标也 从 0 开始 计数)。

请你找出一个整数 k0 <= k <= removable.length),选出 removable 中的 k 个下标,然后从 s 中移除这些下标对应的 k 个字符。整数 k 需满足:在执行完上述步骤后, p 仍然是 s 的一个 子序列 。更正式的解释是,对于每个 0 <= i < k ,先标记出位于 s[removable[i]] 的字符,接着移除所有标记过的字符,然后检查 p 是否仍然是 s 的一个子序列。

返回你可以找出的 最大 k ,满足在移除字符后 p 仍然是 s 的一个子序列。

字符串的一个 子序列 是一个由原字符串生成的新字符串,生成过程中可能会移除原字符串中的一些字符(也可能不移除)但不改变剩余字符之间的相对顺序。

 

示例 1:

输入:s = "abcacb", p = "ab", removable = [3,1,0]
输出:2
解释:在移除下标 3 和 1 对应的字符后,"abcacb" 变成 "accb" 。
"ab" 是 "accb" 的一个子序列。
如果移除下标 3、1 和 0 对应的字符后,"abcacb" 变成 "ccb" ,那么 "ab" 就不再是 s 的一个子序列。
因此,最大的 k 是 2 。

示例 2:

输入:s = "abcbddddd", p = "abcd", removable = [3,2,1,4,5,6]
输出:1
解释:在移除下标 3 对应的字符后,"abcbddddd" 变成 "abcddddd" 。
"abcd" 是 "abcddddd" 的一个子序列。

示例 3:

输入:s = "abcab", p = "abc", removable = [0,1,2,3,4]
输出:0
解释:如果移除数组 removable 的第一个下标,"abc" 就不再是 s 的一个子序列。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int maximumRemovals(string s, string p, vector<int>& removable) { } };

python3 解法, 执行用时: 1984 ms, 内存消耗: 32.5 MB, 提交时间: 2023-09-05 22:28:53

class Solution:
    def maximumRemovals(self, s: str, p: str, removable: List[int]) -> int:
        def exists(t, s, mid):
            se = set(removable[:mid + 1])
            n, m = len(s), len(t)
            i = j = 0
            while i < n and j < m:
                if j not in se and s[i] == t[j]:
                    i += 1
                j += 1
            return i == n
        
        low, high = 0, len(removable)
        while low < high:
            mid = (low + high) // 2
            if exists(s, p, mid):
                low = mid + 1
            else:
                high = mid
        return low

golang 解法, 执行用时: 156 ms, 内存消耗: 8.4 MB, 提交时间: 2023-09-05 22:27:46

func maximumRemovals(s, p string, id []int) int {
	return sort.Search(len(id), func(k int) bool {
		del := make([]bool, len(s))
		for _, i := range id[:k+1] {
			del[i] = true
		}
		j := 0
		for i := range s {
			if !del[i] && s[i] == p[j] {
				if j++; j == len(p) {
					return false
				}
			}
		}
		return true
	})
}

上一题