力扣(leetcode)每日一题 2207 字符串中最多数目的子序列

ops/2024/10/21 7:49:10/
题干

2207. 字符串中最多数目的子序列

给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern ,两者都只包含小写英文字母。

你可以在 text 中任意位置插入 一个 字符,这个插入的字符必须是 pattern[0] 或者 pattern[1] 。注意,这个字符可以插入在 text 开头或者结尾的位置。

请你返回插入一个字符后,text 中最多包含多少个等于 pattern子序列

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

示例 1:

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

示例 2:

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

题解

首先进行抽象取掉噪音
这个问题看着和子序列有关系,其实一点关系都没有
假设pattern是ab组成的。那么要求组成的子序列为ab,那么字符串中,只有含有ab的字符才有可能
也就是可以抽象为 abxxbxxa 转换为 abba
第二步骤,需要遍历任意位置添加a或者b,那是不是所有情况都要考虑到呢,通过观察显然不需要
假设字符串aaabab计算从左边往右边数,遇到a,就数右边有几个b,就可以组成多少组,然后再右移。你以为需要动态规划,压根不需要
那么在哪个位置添加a或者b。就是在最右边加b或者最左边加a。这样可以辐射更多的子序列

代码如下
count1和count2的作用是决定最后添加a还是添加b
dp是缓存i以及往后位置 b的数量

class Solution {public static long maximumSubsequenceCount2(String text, String pattern) {  char index1 = pattern.charAt(0);  char index2 = pattern.charAt(1);  long count1 = 0;  long count2 = 0;  long res = 0;  StringBuilder stringBuilder = new StringBuilder();  char[] charArray = text.toCharArray();  for (char c : charArray) {  if (c == index1) {  stringBuilder.append(c);  count1++;  } else if (c == index2) {  stringBuilder.append(c);  count2++;  }  }  String string = stringBuilder.toString();  if (string.isEmpty()) {  return 0L;  }  if (string.length() == 1) {  return 1;  }  char[] arr = string.toCharArray();  //  a a b b   子序列就是   加上右边有多少个b  //    a a  a  b b  // 新加入a只要计算右边有多少b  // a a    b b b 新加入b,算左边有多少a  // 遍历一次统计右边有多少的b  int[] dp = new int[arr.length];  dp[arr.length - 1] = arr[arr.length - 1] == index2 ? 1 : 0;  for (int i = arr.length - 2; i >= 0; i--) {  dp[i] = dp[i + 1] + (arr[i] == index2 ? 1 : 0);  }  for (int i = 0; i < arr.length - 1; i++) {  if (arr[i] == index1) {  res += dp[i + 1];  }  }  res += Math.max(count2, count1);  return res;  }}

在这里插入图片描述

进一步优化
不仅可以数a右边有多少个b,还可以数b左边有多少个a。 而dp可以从数组优化到一个数字常量,因为可以不断刷新
这样可以只从前往后遍历一次
另外,这个方法需要考虑ab是相同的情况,也就是aa的情况


public static long maximumSubsequenceCount(String text, String pattern) {  char index1 = pattern.charAt(0);  char index2 = pattern.charAt(1);  // 这里需要考虑index1和index2相同的情况  if (index1 == index2) {  long count = 0;  long res = 0;  char[] charArray = text.toCharArray();  for (char c : charArray) {  if (c == index1) {  count++;  res += count - 1;  }  }  res += count;  return res;  }  //  index1和index2不相同的情况  long count1 = 0;  long count2 = 0;  long res = 0;  char[] charArray = text.toCharArray();  for (char c : charArray) {  if (c == index1) {  count1++;  } else if (c == index2) {  count2++;  res += count1;  }  }  res += Math.max(count2, count1);  return res;  
}

在这里插入图片描述

总结

这个题目看着难,还是挺好做的。不算是动态规划,属于数学技巧


http://www.ppmy.cn/ops/119778.html

相关文章

linux系统解压zip文件名乱码

这是 zip 格式本身的缺陷导致的。zip 格式并没有指定文件名的编码格式&#xff0c;在压缩和解压时均使用操作系统本地编码&#xff0c;Windows 下简体中文为 GBK/GB2312 编码&#xff0c;Linux 下为 UTF-8 编码&#xff0c;两者不一致就造成了乱码。 解决方案&#xff1a; 如…

Kafka与RabbitMQ:深入理解两者之间的区别

在现代分布式系统架构中&#xff0c;消息队列作为异步通信的重要手段&#xff0c;扮演着至关重要的角色。Apache Kafka和RabbitMQ作为两大主流消息队列系统&#xff0c;各自具有独特的设计理念和优势。本文将深入探讨Kafka与RabbitMQ之间的主要区别&#xff0c;帮助读者在选择时…

在 Linux 中,要让某一个线程或进程排他性地独占一个 CPU

文章目录 1. CPU 亲和性(CPU Affinity)2. 中断隔离(IRQ Isolation)3. 系统 tickless 模式(NoHZ Mode)4. 实时调度策略5. CPU 隔离(CPU Isolation)和 Full CPU Isolation实现最低的延迟抖动在 Linux 中,要让某一个线程 排他性地独占一个 CPU,并且进一步隔离中断(包括…

数商云B2B2C商城系统如何帮企业降本增效

前言 数商云B2B2C商城系统通过多种方式帮助企业降本增效&#xff0c;以下是具体的分析&#xff1a; 一、整合资源 供应商管理&#xff1a;数商云B2B2C商城系统通过整合上游供应商资源&#xff0c;实现对供应商的统一管理和评估。企业可以更高效地选择优质供应商&#xff0c;…

Python空间地表联动贝叶斯地震风险计算模型

&#x1f3af;要点 使用贝叶斯推断模型兼顾路径和场地效应&#xff0c;量化传统地理统计曲线拟合技术。使用破裂和场地特征等地质信息以及事件间残差和事件内残差描述数学模型模型使用欧几里得距离度量、角距离度量和土壤差异性度量确定贝叶斯先验分布和后验分布参数&#xff…

南沙C++信奥赛陈老师解一本通题 2005:【20CSPJ普及组】直播获奖

【题目描述】 NOI2130 即将举行。为了增加观赏性&#xff0c;CCF 决定逐一评出每个选手的成绩&#xff0c;并直播即时的获奖分数线。本次竞赛的获奖率为 w%w%&#xff0c;即当前排名前 w%w% 的选手的最低成绩就是即时的分数线。 更具体地&#xff0c;若当前已评出了 pp 个选手的…

网关的作用及其高可用性设计详解

引言 在现代分布式系统架构中&#xff0c;网关&#xff08;Gateway&#xff09;是一个关键组件。它作为客户端与后端服务之间的桥梁&#xff0c;不仅提供了请求路由、负载均衡、安全认证、流量控制等功能&#xff0c;还能够保护后端服务的安全和稳定性。网关的设计和高可用性对…

小米2025届软件开发工程师(C/C++/Java)(编程题AK)

选择题好像也是25来个 编程题 T1 题目描述 小明喜欢解决各种数学难题。一天&#xff0c;他遇到了一道有趣的题目:他需要帮助他的朋友们完成一个排序任务。小明得到两个长度为 n 的数组a[]和b[]。他可以在两个数组对应位置进行交换&#xff0c;即选定一个位置 i &#xff0c…