2207 字符串中最多数目的子字符串(递推)

news/2025/3/25 18:58:21/

1. 问题描述:

给你一个下标从 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' ,那么我们得到 "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" 。
 
提示:

1 <= text.length <= 10 ^ 5
pattern.length == 2
text 和 pattern 都只包含小写英文字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-number-of-subsequences-in-a-string/

2. 思路分析:

分析题目可以知道我们需要先统计一下text中有多少个子序列等于pattern,一开始想到的是递推,类似于3789题,是3789题的简化版,使用一个长度为26的数组s来统计text中每一个字符的出现次数,二维数组f来记录以当前字母结尾的字母对的数量,其中f[i][j]表示以当前位置j对应的字母结尾的字母对的数量,每一次枚举以当前字母结尾的字母,然后枚举26个字母,将以当前字母结尾的字母对的结果更新到f[i][j]中(将前i个字符的出现的次数累加到对应位置上),因为需要插入pattern中的一个字母而且这个字母可以插入到text中的任意位置,最大值肯定是text中等于pattern的子序列的数量加上插入pattern中任意一个字符方案的最大值;其实我们可以发现子序列是唯一确定的,所以可以直接递推,相当于是对上面做法的优化,我们可以使用两个变量count_a,count_b分别统计pattern中两个字母的出现次数,如果当前枚举字母等于pattern中的第一个字母那么count_a出现次数加1,如果是pattern的第二个字母说明以答案需要加上以当前字母b结尾的子序列的数量也即需要加上字母a出现的次数,我们枚举每一个字母这样肯定可以统计出所有等于pattern子序列的数量,最后加上插入pattern中任意一个字母的最大值即可,这里还需要注意一个特殊情况是pattern中的两个字母可能相等,相等的时候直接统计pattern中字母的出现次数,直接使用等差数列公式计算即可。

3. 代码如下:

class Solution:def maximumSubsequenceCount(self, text: str, pattern: str) -> int:# s统计每一个字符的出现次数s = [0] * 26# f[i][j]统计j对应的字母结尾的字母对的出现次数f = [[0] * 26 for i in range(26)]n = len(text)c1, c2 = ord(pattern[0]) - ord("a"), ord(pattern[1]) - ord("a")for i in range(n):c = ord(text[i]) - ord("a")for j in range(26):f[j][c] += s[j]s[c] += 1c1, c2 = ord(pattern[0]) - ord("a"), ord(pattern[1]) - ord("a")res = max(f[c1][c2] + s[c2], f[c1][c2] + s[c1])return res

优化:

class Solution:def maximumSubsequenceCount(self, text: str, pattern: str) -> int:a, b = pattern[0], pattern[1]if a == b:count = 0for c in text:if c == a:count += 1return count * (count + 1) // 2count_a = count_b = res = 0for c in text:if c == a:count_a += 1elif c == b:count_b += 1res += count_areturn max(res + count_a, res + count_b)

http://www.ppmy.cn/news/759213.html

相关文章

Linux下载

想安装linux&#xff0c;但是很多资源都是私人云盘&#xff0c;下面就来说明官网下载的教程 官网地址&#xff1a;https://www.centos.org/ 链接直通车 进入后 如下界面&#xff0c;点击进入Donwload ps&#xff1a;&#xff08;进入时间参照2022-11-29&#xff09; 进入后…

下载centOS,下载各种linux版本的镜像,来这里!

下载各种版本的linux版本&#xff0c;推荐华为云下载&#xff0c;速度快 http://mirrors.tuna.tsinghua.edu.cn/ 阿里云镜像站 http://mirrors.aliyun.com/ 阿里云镜像站 http://mirrors.huaweicloud.com/ 华为镜像站 http://mirrors.nju.edu.cn/ 南京大学镜像站 http://mirro…

CentOS 7镜像下载 以及 DVD ISO 和 Minimal ISO 等各版本的区别介绍

官网下载 官网下载地址&#xff1a;http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso 点击进入下载页面&#xff0c;随便选择一个下载即可&#xff08;不推荐&#xff0c;推荐网易开源镜像或者阿里云这些国内开源镜像网站下载&#xff0c;见下…

【Linux操作系统】——配置安装系统环境

Linux操作系统——配置安装系统环境 这里Linux我们使用发行版的Centos7.6版本 简单介绍一下Centos&#xff1a; CentOS 是一个基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本。每个版本的 CentOS都会获得十年的支持&#xff08;通过安全更新方式&#xff09;。…

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

leetcode力扣刷题打卡 *题目&#xff1a;2207. 字符串中最多数目的子字符串 描述&#xff1a;给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern &#xff0c;两者都只包含小写英文字母。 你可以在 text 中任意位置插入 一个 字符&#…

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

题目链接&#xff1a; 力扣https://leetcode-cn.com/problems/maximize-number-of-subsequences-in-a-string/ 【分析】由于pattern中只有两个字符&#xff0c;假设分别是a、b&#xff0c;只需要统计出text中每个a后面有多少b即可&#xff0c;这儿这个通过后缀和的思想&#x…

Leetcode 2207:字符串中数目最多的子字符串

做这道题&#xff0c;走了一个小时的弯路&#xff0c;大冤种是谁我不说&#x1f427; 事情是这样的&#xff0c;大早起八点多钟没啥思路&#xff0c;吃完早饭还困着呢。迷迷糊糊我就想着用Cstring的各种函数来解决这道题&#xff1a; 先利用 find 函数确定两字符pattern[0] pa…

Centos7镜像版本命名规则

例&#xff1a;CentOS-7-x86_64-Everything-2207-02.iso 1.CentOS-7指的是7.x版本&#xff1b; 2.x86_64指的是64位操作系统&#xff1b; 3.Everything指的是全功能版&#xff1b; 对应表如下 DVDNetInstallEverythingLiveGNOMELiveKDELiveCDMinimal标准版网络安装版全功能…