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

2023-11-14

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] += 1
        c1, 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 = 0
            for c in text:
                if c == a:
                    count += 1
            return count * (count + 1) // 2
        count_a = count_b = res = 0
        for c in text:
            if c == a:
                count_a += 1
            elif c == b:
                count_b += 1
                res += count_a
        return max(res + count_a, res + count_b)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2207 字符串中最多数目的子字符串(递推) 的相关文章

  • WinForm:禁用Panel容器滚动条自动移动位置的功能

    今天遇到了一个问题 描述如下 有一个Panel容器 将AutoScroll属性设置为True 此时Panel容器会在内容过多时自动展示一个滚动条 这个滚动条存在一个缺点 即会随着焦点变化自动滚向焦点位置 如果仅初始化界面时Panel滚动条位
  • MIT-BIH ECG 心电数据的下载和读取图解

    一 如何下载获取MIT BIH的数据从下面这个官方链接页面可以下载到所有48组MIT BIH心电数据 http www physionet org physiobank database mitdb 下面这个链接是MIT BIH数据库的详细

随机推荐

  • cocos2dx游戏以插件形式嵌入IE浏览器的实现

    一 cocos2dx渲染窗口修改及导出dll 1 思路 cocos2dx引擎使用opengl进行游戏画面的渲染 opengl的渲染窗口由其自身创建 具有跨平台性 那么我可以对渲染窗口进行修改 便可以达到将游戏窗口嵌入其他窗口的效果 2 实现
  • 【火灾检测】基于HSV特征实现火灾检测附matlab代码

    1 简介 针对传统火灾监测系统对于大空间的室内场合和开阔的室外环境易失效的问题 提出了一种结合火灾火焰特征和烟雾特征来进行判断的数字图像型火灾监测算法 火焰颜色特征是基于RGB颜色模型中的R G B三基色分量和它们之间的关系来判断是否有火焰
  • 网络攻防——ARP欺骗

    arp基础攻防 1 什么是arp攻击 2 arp攻击条件 3 arp如何进行攻击 3 1靶机环境搭建 3 2攻击机环境搭建 3 3如何发起arp攻击 4 如何防止arp攻击 5 参考文献 1 什么是arp攻击 ARP攻击是指攻击者利用ARP
  • python [3.2] urllib的使用

    urllib是python的一个获取url Uniform Resource Locators 统一资源定址器 的模块 它用urlopen函数的形式提供了一个非常简洁的接口 这使得用各种各样的协议获取url成为可能 它同时 也提供了一个稍微
  • 图灵1

    简介 艾伦 麦席森 图灵 英语 Alan Mathison Turing 1912年6月23日 1954年6月7日 英国数学家 逻辑学家 被称为计算机科学之父 人工智能之父 艾伦 麦席森 图灵 生平 1912年6月23日 艾伦 麦席森 图灵
  • SpringAOP的实现原理

    一 SpringAOP的面向切面编程 是面向对象编程的一种补充 用于处理系统中分布的各个模块的横切关注点 比如说事务管理 日志 缓存等 它是使用动态代理实现的 在内存中临时为增强某个方法生成一个AOP对象 这个对象包含目标对象的所有方法 在
  • 求m到n之间的素数和(函数)python

    目录 题目描述 AC代码 题目描述 输入两个正整数m和n m
  • k8s持久化存储

    目录 一 为什么要做持久化存储 1 emptyDir类型 2 hostPath 3 nfs 4 pvc 1 pv是什么 2 PVC是什么 5 storageclass 一 为什么要做持久化存储 在k8s中部署的应用都是以pod容器的形式运行
  • Windows 安装Redis(图文详解)

    一 Redis是什么数据库 Remote Dictionary Server Redis 是一个开源的使用 ANSI C 语言编写 遵守 BSD 协议 支持网络 可基于内存 分布式 可选持久性的键值对 Key Value 存储数据库 并提供
  • eclipse怎么在包里建一个包

    实现效果如下图 废话不多说 上图 1 设置Package Presentation 为Hierarchical 最为关键一步 2 在src下新建一个名为com abc hrm的包 3 在父包下新建子包a 因为只有一个子包 建完的子包会这样显
  • 关于绿色校园建设中综合能效平台的管理效益与研究

    摘要 伴随当前环保理念的不断发展 绿色节能理念也在逐步深入校园 为响应国家建设节约型校园的号召 本文以校园智能化综合能效管理平台建设为主题 介绍了平台建设方案 比较了某高校平台建设前后学生宿舍 教学及实训楼用能情况 分析结果表明高校综合能效
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • Java如何获取平台(操作系统)的默认编码

    Java如何获取平台 操作系统 的默认编码 平台 这两个字指的就是操作系统 比如Windows平台 MacOS平台 Linux平台 这也是我们经常读API文档的时候见到的英文 platform 如 platform encoding 如何获
  • spring-MVC

    Spring MVC Hello Spring MVC web xml 在WEB INF目录下创建 web xml 配置Spring MVC的入口 DispatcherServlet 把所有的请求都提交到该Servlet
  • 数据库十一章——并发控制

    11 1 并发控制概述 1 并发操作带来的数据不一致性 1 丢失修改 Lost Update 两个事务T1和T2读入同一数据并修改 T2的提交结果破坏了T1提交的结果 导致T1的修改被丢失 2 不可重复读 Non repeatable Re
  • XGBoost学习(六):输出特征重要性以及筛选特征

    XGBoost学习 一 原理 XGBoost学习 二 安装及介绍 XGBoost学习 三 模型详解 XGBoost学习 四 实战 XGBoost学习 五 参数调优 XGBoost学习 六 输出特征重要性以及筛选特征 完整代码及其数据 XGB
  • makefile-gdb

    makefile gdb 1 makefile makefile 文件中定义了 一系列的规则来指定 哪些文件需要先编译 哪些文件需要后编译 哪些文件需要重新编译 甚至于进行更复杂的功能操作 就像是一个shell脚本 其中也可以执行操作系统的
  • 关于迅雷与优酷

    迅雷的用户许可协议上有这样一段 4 4 使用本 软件 涉及到互联网服务 可能会受到各个环节不稳定因素的影响 存在因不可抗力 计算机病毒 黑客攻击 系统不稳定 用户所在位置 用户关机以及其他任何网络 技术 通信线路等原因造成的服务中断或不能满
  • 语义分割方法总结与综述

    语义分割论文 Dilated convolution low level high level information fusion 2019 CVPR DFANet Deep Feature Aggregation for Real Ti
  • 2207 字符串中最多数目的子字符串(递推)

    1 问题描述 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern 两者都只包含小写英文字母 你可以在 text 中任意位置插入一个字符 这个插入的字符必须是 pattern 0 或者