当前位置: 首页 > article >正文

LeetCode2207解题思路

题目描述

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

解题思路:

题目要求我们找到在 text 中 找到最多可组成 pattern 的字符串个数,并且允许在 text 的任意位置插入 pattern 中一个字符,也就是说我们只需要考虑 text 中的 pattern 含有的字符即可。例如示例 1 中 text = "abdcdbc",pattern = "ac",如果只考虑 text 中的 ac 即可将 text 简化为 "acc",这样一来就看起来简单多了。

由上面的图可以知道,"acc" 中可组成 "ac" 的个数为 3。再考虑往 text 中添加 "a" 或 "c",为了使添加后个数最多,可以选择将 "a" 放在第一个位置上,或把 "c" 放在最后一个位置上,可以组成如下图所示的两种情况:

由上图可以看出,由于 text 中 "c" 的数目较多,所以将 "a" 添加在 text 首端,可再组成 "c" 的数目个配对

总结一个式子:result = text匹配对数 + text中数目较多 pattern 中含有的字符

text中数目较多 pattern 中含有的字符容易统计遍历一遍 text 即可。

下面来看看 text 匹配对数该如何计算:

leetcode给出的示例不足以展示所有的情况,所以看以下两个示例:

第 1 个 "c" 可匹配 "ac"个数:1。因为他的前面有 1 个 "a";

第 2 个 "c" 可匹配 "ac"个数:2。因为他的前面有 2 个 "a";

第 3 个 "c" 可匹配 "ac"个数:2。因为他的前面有 2 个 "a";

text 中共计可匹配个数为:1 + 2 + 2 = 5。

由于 text 中 "a" 的个数为 2,"c" 的个数为 3,"c" 的数目比较多,所以最终结果在加上 3,最终结果为 8。

综上可以看出来我们只需要遍历一次 text,统计出来 "a","c"个数和 "c" 前面的 "a" 个数求和即可。

再来看另一个特殊情况

示例中 pattern 的两个字符相同,在任意位置添加一个 r 计算可匹配的个数即可

如图,由第一个 "r" 匹配结果,可组成 3 对。依次类推,第二个可组成 2 对,第三个可组成 1 对。最终结果 = 3 + 2 + 1 = 6

显然这是一个等差数列求和。求和公式Sn = (首项 + 末项) * 项数 / 2。在此题中,第一项从 3 开始,即 text 中 "r" 的个数。所以我们可以直接用 text 中 "r" 的个数求和。

代码实现

 class Solution {
     public long maximumSubsequenceCount(String text, String pattern) {
         // 为什么转成 char 数组, 别问, 问就是快
         char[] charArray = text.toCharArray();
         // pattern中的第一个字符
         char first = pattern.charAt(0);
         // pattern中的第二个字符
         char second = pattern.charAt(1);
         // 最终返回结果
         long res = 0;
         // 第一个字符的个数
         int firstCount = 0;
         // 第二个字符的个数
         int secondCount = 0;
         // 统计原来text中可组成pattern的个数
         for (char c : charArray) {
             if (c == first) {
                 // 统计第一个字符的个数
                 firstCount++;
             } else if (c == second) {
                 // 统计第二个字符的个数
                 secondCount++;
                 // 碰到第二个字符时, 将其可匹配的个数加到结果中
                 res += firstCount;
             }
         }
         /*
         情况1:pattern 中两个字符不同
         可添加一个字符
         将第一个字符插入到0的位置上, 可以增加 secondCount 个结果
         将第二个字符插入到 text 末尾, 可以增加 firstCount 个结果
         比较 firstCount 和 secondCount, 哪个大就用哪一个组成结果
 ​
         情况1:pattern 中两个字符相同
         如果 pattern 两个字符相同, 直接统计该字符的个数, 等差数列求和即可
         */
         return first == second ? ((long) firstCount + 1) * firstCount / 2 : firstCount > secondCount ? res + firstCount : res + secondCount;
     }
 }

http://www.kler.cn/a/319154.html

相关文章:

  • pip3 install -e .[stable]讲解
  • 红帽认证和华为认证哪个好?看完这4点你就明白了
  • SpringSecurity源码中核心类
  • Ubuntu20.4系统编译瑞芯微RK3568 SDK
  • 原生 JavaScript基本内容和常用特性详解
  • 【量化交易笔记】14.模拟盘效果
  • 双十一买什么好?五款数码好物推荐!
  • 毕业设计选题:基于ssm+vue+uniapp的面向企事业单位的项目申报小程序
  • 1.3 MySql的用户管理
  • 电脑如何录屏?无水印、高清晰度电脑录屏教程
  • 『功能项目』QFrameWork道具栏物品生成【64】
  • thinkphp8 从入门到放弃(后面会完善用到哪里写到哪)
  • C#图像爬虫实战:从Walmart网站下载图片
  • python常见的魔术方法
  • 对FPGA加载过程中不同寄存器初始化方式现象的分析
  • 基于PHP的CRM管理系统源码/客户关系管理CRM系统源码/php源码/附安装教程
  • 免费分享必看!AI合规常见问题解答(二)
  • java之斗地主部分功能的实现
  • 修改Linux服务器系统语言
  • 深入解析Debian与Ubuntu:技术特点与用户使用指南
  • Git 详细安装教程(详解 Git 安装过程的每一个步骤)
  • Python 课程19-FastAPI
  • 开源 AI 智能名片与 S2B2C 商城小程序:嫁接权威实现信任与增长
  • 深入解析:HTTP 和 HTTPS 的区别
  • 51单片机开关电路+限位+舵机
  • 【玉米田】