题目

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

请你找出一个整数 k(0 <= 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 的一个子序列。

解题思路

  1. 先写一个函数判断移除了前k个下标以后的s,是否还满足p 是 s 的一个 子序列。

  2. 因为移除下标的个数具有单调性,移除的下标越多,那么仍然满足子序列就越困难,因此使用二分法找出最多移除多少个下标,使得p 仍然是 s 的一个 子序列。

代码

class Solution {public boolean re(String stringBuilder, String p,Set<Integer> set) {int j=0;for (int i=0;i<stringBuilder.length();i++){if (j==p.length())return true;if(set.contains(i)) continue;if(stringBuilder.charAt(i)==p.charAt(j))j++;}return j==p.length();}public int maximumRemovals(String s, String p, int[] removable) {HashSet<Integer> set = new HashSet<>();StringBuilder builder = new StringBuilder(s);int l=0,r=removable.length-1;while (l<=r){int mid=(r-l)/2+l;for (int i = 0; i <=mid; i++) {set.add(removable[i]);}if(re(s,p,set)){l=mid+1;}else{r=mid-1;}set.clear();}return l;}
}

leetcode 5786. 可移除字符的最大数目(二分法)相关推荐

  1. C++描述 LeetCode 5677. 统计同构子字符串的数目

    C++描述 LeetCode 5677. 统计同构子字符串的数目   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写 ...

  2. 1638 统计只差一个字符的子串数目(动态规划)

    1. 问题描述: 给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串.换言之,请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对 ...

  3. Leetcode.1641 统计字典序元音字符串的数目

    题目链接 Leetcode.1641 统计字典序元音字符串的数目 Rating : 1519 题目描述 给你一个整数 n,请返回长度为 n.仅由元音 (a, e, i, o, u)组成且按 字典序排列 ...

  4. [贪心|字符串] leetcode 3 无重复字符的最长子串

    [贪心|字符串] leetcode 3 无重复字符的最长子串 1.题目 题目链接 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例1: 输入: "abcabcbb" ...

  5. LeetCode / Scala - 无重复字符最长子串 ,最长回文子串

    一.引言 LeetCode 里有一类字符子串问题,这里主要分析无重复字符的最长子串与最长回文子串,总结相关方法. 二.无重复字符最长子串 1.题目要求 给定字符串 s,要求找出字符内无重复的最长子串, ...

  6. LeetCode 1638. 统计只差一个字符的子串数目(DP)

    文章目录 1. 题目 2. 解题 2.1 暴力枚举 2.2 DP 1. 题目 给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换 一个不同字符 以后,是 t 串的子串. ...

  7. LeetCode 1805. 字符串中不同整数的数目(哈希set)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 word ,该字符串由数字和小写英文字母组成. 请你用空格替换每个不是数字的字符. 例如,"a123bc34d8ef34&quo ...

  8. LeetCode 1759. 统计同构子字符串的数目

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,返回 s 中 同构子字符串 的数目. 由于答案可能很大,只需返回对 10^9 + 7 取余 后的结果. 同构字符串 的定义为:如果一 ...

  9. LeetCode简单题之字符的最短距离

    题目 给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符. 返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s ...

最新文章

  1. NLP --- 条件随机场CRF详解 重点 特征函数 转移矩阵
  2. Python第一天:你必须要知道的Python擅长领域以及各种重点学习框架(包含Python在世界上...
  3. Java进阶学习之Java架构师的学习路线
  4. 【读书笔记】阅读的危险
  5. MongoDB-pymongo
  6. m1笔记本android开发,Apple M1设备开发Android小tips
  7. GDI+中发生一般性错误 以及发布时候需要配置的文件
  8. Mysql 扩展性设计之数据切分、那么数据切分后会带来哪些问题呢?比如分布式事务、数据的一致性、垂直切分和水平切分应用场景
  9. mysql启动提示 access denied for user root@localhost(using password:YES) 解决办法总结
  10. https阿里云证书购买与apache环境配置
  11. freemarker生成java代码,freeMarker之根据模板生成JAVA代码示例
  12. 计算机软件实习项目四 —— 校园一卡通管理系统 (实验准备) 12-27
  13. 纯真数据库mysql_纯真数据库下载或自动更新实现
  14. 【每日英语】英语语法
  15. Java获取图片传到前端,生成二维码给前端
  16. 弘辽科技:扶持100个新品牌销量过亿投资人在抖音看到哪些机会?
  17. git 解决冲突后提交 fatal: cannot do a partial commit during a merge.
  18. Google PR劫持(转)
  19. 进程同步C语言p v实验报告,操作系统实验报告模板
  20. 谱图理论(spectral graph theory)

热门文章

  1. CodeForces - 1141ESuperhero Battle简单模拟
  2. 深入研究socket编程(3)——使用select函数编写客户端和服务器
  3. 这是一份面向Android开发者的复习指南,成功入职字节跳动
  4. spring 注解方式配置Bean
  5. 中英文对照 —— 机械
  6. 通过NSNotification来监听键盘弹出和弹回
  7. 新书《编写可测试的JavaScript代码 》出版,感谢支持
  8. POJ2104 (平方分割)二分查找理解。
  9. 搜索引擎怎么收集的那么多内容?
  10. 利用 Docker 搭建单机的 Cloudera CDH 以及使用实践