【每日一题】LeetCode 2207.字符串中最多数目的子序列(贪心、字符串、前缀和)

server/2024/9/25 4:11:21/

【每日一题】LeetCode 2207.字符串中最多数目的子序列(贪心、字符串、前缀和)

题目描述

给定一个字符串 text 和一个长度为2的字符串 pattern,两者都由小写英文字母组成。你可以在 text 中任意位置插入一个字符,这个插入的字符必须是 pattern[0] 或者 pattern[1]。插入后,需要计算 text 中最多可以包含多少个等于 pattern 的子序列。

子序列 定义为:将一个字符串删除若干个字符后(也可以不删除),剩余字符保持原本顺序得到的字符串。

思路分析

这个问题可以通过动态规划解决,但这里我们使用一种更简单的贪心算法

  1. 理解子序列:首先理解子序列的概念,即 pattern 可以作为 text 的一部分,且顺序不变。
  2. 计数:遍历 text,使用两个计数器 cnt1cnt2 分别计数 pattern[0]pattern[1]text 中出现的次数。
  3. 贪心策略:对于每个 pattern[1] 的出现,它都可以与之前所有 pattern[0] 的出现组合成 pattern,因此每找到一个 pattern[1],就将 cnt1 加到答案 ans 中。
  4. 插入策略:在遍历结束后,比较 cnt1cnt2 的大小,因为我们可以插入一个字符来增加子序列的数量。插入 pattern[0] 可以增加 cnt2 的数量,插入 pattern[1] 可以增加 cnt1 的数量。
  5. 返回答案:最终答案为 ans + Math.max(cnt1, cnt2)

输入示例

示例 1:

输入:text = "abdcdbc", pattern = "ac"
输出:4
解释:
如果我们在 text[1] 和 text[2] 之间添加 pattern[0] = 'a' ,那么我们得到 "abadcdbc" 。那么 "ac" 作为子序列出现 4 次。
其他得到 4 个 "ac" 子序列的方案还有 "aabdcdbc" 和 "abdacdbc" 。
但是,"abdcadbc" ,"abdccdbc" 和 "abdcdbcc" 这些字符串虽然是可行的插入方案,但是只出现了 3 次 "ac" 子序列,所以不是最优解。
可以证明插入一个字符后,无法得到超过 4 个 "ac" 子序列。

示例 2:

输入:text = "aabb", pattern = "ab"
输出:6
解释:
可以得到 6 个 "ab" 子序列的部分方案为 "aaabb" ,"aaabb" 和 "aabbb" 

代码实现

java">class Solution {public long maximumSubsequenceCount(String text, String pattern) {char p1 = pattern.charAt(0); // pattern的第一个字符char p2 = pattern.charAt(1); // pattern的第二个字符long ans = 0; // 初始化答案为0int cnt1 = 0; // 用于计数text中pattern[0]出现的次数int cnt2 = 0; // 用于计数text中pattern[1]出现的次数for (char c : text.toCharArray()) { // 遍历text中的每个字符if (c == p2) { // 如果当前字符是pattern的第二个字符ans += cnt1; // 将cnt1加到答案中,因为每一个pattern[1]都可以与之前的pattern[0]组合cnt2++; // 增加pattern[1]的计数}if (c == p1) { // 如果当前字符是pattern的第一个字符cnt1++; // 增加pattern[0]的计数}}// 返回最终答案,即现有的子序列数量加上可以插入一个字符后增加的最大子序列数量return ans + Math.max(cnt1, cnt2);}
}

http://www.ppmy.cn/server/121647.html

相关文章

二进制日志gtid模式

# --skip-gtids,使用mysqlbinlog截取时添加该参数,会执行已经执行的事务 mysqlbinlog --skip-gtids --include-gtidsa56fdfdc-7699-11ef-8f40-000c297f81d5:40 /data/binlog/mysql-bin.000003 > gtid.sql # --skip-gtids,使用mysqlbinlog截…

web基础—dvwa靶场(十一)CSP Bypass

CSP Bypass(CSP 绕过) 内容安全策略(CSP)用于定义脚本和其他资源可以从何处加载或执行,本模块将指导您根据开发人员犯下的常见错误来绕过该策略。 这些漏洞都不是 CSP 中的实际漏洞,它们都是实现 CSP 的方式中的漏洞。 绕过内容安…

38.重复的子字符串

方法1: class Solution {public boolean repeatedSubstringPattern(String s) {if (s.equals("")) return false;String s2(ss).substring(1,(ss).length()-1);//去掉首尾字符return s2.contains(s);//判断是否包含s} } class Solution(object):def rep…

rocky9.2的lvs的NAT模式下的基本使用的详细示例

文章目录 前言什么是LVS?(Linux Virtual Server)LVS的组成1. 负载均衡器(Load Balancer)2. 后端服务器池(Real Servers)3. IPVS(IP Virtual Server)4. 调度算法(Schedul…

Docker 消息队列RabbitMQ 安装延迟消息插件

介绍 RabbitMQ的官方推出了一个插件,原生支持延迟消息功能。该插件的原理是设计了一种支持延迟消息功能的交换机。当消息投递到交换机后可以暂存一定时间,到期后再投递到队列。 查看版本号 docker exec rabbit名字 rabbitmqctl version根据版本下载 插…

握手传输 状态机序列检测(记忆科技笔试题)_2024年9月2日

发送模块循环发送0-7,在每个数据传输完成后,间隔5个clk,发送下一个 插入寄存器打拍处理,可以在不同的时钟周期内对信号进行同步,从而减少亚稳态的风险。 记忆科技笔试题:检测出11011在下一个时钟周期输出…

CTF 技能树 LOG -GIT泄露 笔记

log 使用虚拟机kali操作 python2 安装 apt-get install python2 进入root用户,下载克隆git hack库 git clone https://github.com/BugScanTeam/GitHack sudo passwd root 修改root 命名密码为root 切换登录 su root 终端进入home/kali/GitHack/ python GitH…

rabbitmq交换机

交换机 Fanout交换机(广播) 创建队列 创建fanout.queue01和fanout.queue02 创建交换机 创建绑定关系 测试 两个队列都收到了消息 总结 交换机的作用 接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失Fanou…