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

news2024/11/17 1:29:39
题干

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.coloradmin.cn/o/2171838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升论文质量必备!2024年顶尖8款AI写作工具!

各位好&#xff01;在这个信息化迅速发展的年代&#xff0c;AI技术已经成为我们学术探索的重要辅助力量。本次&#xff0c;我将向大家展示2024年八款必备的尖端AI应用。这些工具不仅能极大提升我们撰写学术论文的效率&#xff0c;还能改善研究的质量。 首先我们来看“梅子AI论…

Langgraph 的 Planning Agent 深度解析

在人工智能领域&#xff0c;智能代理&#xff08;agent&#xff09;的设计愈发重要。尤其在面对复杂任务时&#xff0c;规划&#xff08;planning&#xff09;技术成为智能代理的核心能力之一。Langgraph 是一个专为构建智能代理而设计的框架&#xff0c;结合了自然语言处理&am…

2024年项目经理不容错过的资源:全面测试管理工具指南与精选实例

随着软件开发的快速发展&#xff0c;测试管理工具在项目经理的日常工作中扮演着越来越重要的角色。2024年&#xff0c;哪些测试管理工具是项目经理不能错过的呢&#xff1f;本文将为您带来一份全面指南&#xff0c;帮助您找到最佳选择。 在软件开发过程中&#xff0c;测试是确保…

鸿蒙开发(NEXT/API 12)【硬件(接入手写套件)】手写功能开发

接入手写套件后&#xff0c;可以在应用中创建手写功能界面。界面包括手写画布和笔刷工具栏两部分&#xff0c;手写画布部分支持手写笔和手指的书写效果绘制&#xff0c;笔刷工具栏部分提供多种笔刷和编辑工具&#xff0c;并支持对手写功能进行设置。接入手写套件后将自动开启一…

机器学习方法实现水果分类(零基础小白向),手工提取水果图片特征,不一样的特征提取方法

文章目录 零、前言&#xff1a;一、什么是特征向量&#xff1f;二、数据准备三、构建数据集1、什么是数据集&#xff1f;2、图片对应的标签&#xff1f;3、特征提取方法&#xff08;1&#xff09;生成固定正方形&#xff08;2&#xff09;特征提取实现 四、建立模型五、自定义数…

【Python】遇见的问题:为项目选择的 Python 解释器无效

一、问题说明 导入项目文件后&#xff0c;提示“为项目选择的 Python 解释器无效” 二、问题原因 暂时不知道 三、解决办法 第一步&#xff1a;添加本地解释器 第二步&#xff1a;点击确定 位置&#xff1a;当前项目所在目录 基础解释器&#xff1a;python.exe所在目录 第三…

五子棋双人对战项目(2)——登录模块

目录 一、数据库模块 1、创建数据库 2、使用MyBatis连接并操作数据库 编写后端数据库代码 二、约定前后端交互接口 三、后端代码编写 文件路径如下&#xff1a; UserAPI&#xff1a; UserMapper&#xff1a; 四、前端代码 登录页面 login.html&#xff1a; 注册页面…

C++语法—引用

引用变量 概念 简单理解就是对一个已存在的变量起别名&#xff0c;与那个已存在的变量共用一块内存空间。 用法&#xff1a;已存在变量的类型 & 引用变量名 &#xff08;引用实体&#xff09;已存在变量 int main() {int a 1;int& b a;return 0; }在上面这个示例…

minio 快速入门+单机部署+集群

目录 原理 概念 名词解释 Set /Drive 的关系 MinIO部署 单机 单机单盘 单机多盘 集群 多机单盘 多机多盘 配置负载均衡 调优 原理 MinIO是一个S3兼容的高性能对象存储&#xff0c;其主要特点如下&#xff1a; 适合存储大容量非结构化的数据&#xff0c;如图片&…

骨传导耳机品牌排行榜分享:360度实测分析10款抢手骨传导耳机!

随着科技的不断进步和人们生活方式的变化&#xff0c;骨传导耳机以其独特的传声方式和开放式设计&#xff0c;逐渐成为运动爱好者、户外活动家以及听力障碍人士的新宠。不同于传统耳机将声音直接导入耳道&#xff0c;骨传导耳机通过振动颅骨将声音传递至内耳&#xff0c;不仅能…

数据结构与算法——Java实现 20.习题——二叉树层序遍历

认真的人改变自己&#xff0c;执着的人改变命运 —— 24.9.27 102. 二叉树的层序遍历 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1a; 输入&#xff1a;root [1] 输出&#xff1a;[[1]]示例 3&…

Java单体服务和集群分布式SpringCloud微服务的理解

单体应用存在的问题 1.随着业务的发展开发变得越来越复杂。 2.修改或者新增&#xff0c;需要对整个系统进行测试、重新部署。 3.一个模块出现问题&#xff0c;很可能导致整个系统崩溃。 4.多个开发团队同时对数据进行管理&#xff0c;容易产生安全漏洞。 5.各个模块使用同…

Spring Session学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

如何在算家云搭建MVSEP-MDX23(音频分离)

一、MVSEP-MDX23简介 模型GitHub网址&#xff1a;MVSEP-MDX23-music-separation-model/README.md 在 main ZFTurbo/MVSEP-MDX23-音乐分离模型 GitHub 上 在音视频领域&#xff0c;把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有…

快消品海外仓应该如何选择合适WMS仓储系统?

快消品的“快”属性天然契合海外仓&#xff0c;快消品大部分是必需品&#xff0c;库存周转快&#xff0c;需保持一定量的安全库存&#xff0c;及时、稳定补货尤为重要&#xff1b;快消品最适合全渠道销售&#xff0c;线上线下等&#xff0c;比较考验备货和统筹能力&#xff1b;…

基于RustDesk自建远程桌面服务

最近向日葵越来越难用了&#xff0c;官方好像限制了免费用户的带宽&#xff0c;但是限制的有点过头了&#xff0c;卡的基本没法用。 向日葵的平替todesk对于免费用户又有时长限制&#xff0c;对于经常用的小伙伴不大友好。 咱也不是说非得白嫖&#xff0c;但是向日葵和todesk这…

观测云链路追踪分析最佳实践

背景 如果要在开发、运维和工程层面持续改进一个涉及多服务的应用&#xff0c;以链路追踪、日志检索、指标收集、用户体验监测、性能剖析、关联分析等作为代表性技术的可观测性必不可少&#xff0c;这一看法已成为共识&#xff0c;但在采用这项技术的过程中&#xff0c;如何分…

msvcr100.dll丢失的解决方法,六种解决msvcr100.dll丢失使用技巧

在使用计算机的过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcr100.dll丢失”。这个问题可能会让我们感到困惑和无助&#xff0c;但是不用担心&#xff0c;本文将为大家介绍六种实用的解决方法&#xff0c;帮助你轻松解决这个问题。 一&#xff…

【JAVA报错已解决】Java.lang.NullPointerException

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

朋友圈信息流广告投放,曝光成本是多少?

微信作为国内最流行的社交平台之一&#xff0c;其朋友圈广告凭借精准的用户画像和强大的社交属性&#xff0c;成为了众多品牌商家进行市场推广的重要渠道。云衔科技推出了专业的微信朋友圈广告开户及代运营服务&#xff0c;旨在帮助企业轻松跨越技术门槛&#xff0c;精准触达目…