力扣题解2207

大家好,欢迎来到无限大的频道。

今日继续给大家带来力扣题解。

题目描述(中等)​:

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

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

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

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

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

题目分析:

  • 给定一个字符串 text 和一个长度为 2 的字符串 pattern,你可以在 text 的任意位置插入一个字符(这个字符必须是 pattern0 或 pattern1),目的是使 text 中的 pattern 子序列数量最多。

  • 子序列是指从字符串中删除若干字符(或不删除),其余字符保持原顺序。

解题思路:

  1. 计数:

    • 遍历 text,统计 pattern0 和 pattern1 的出现次数。

    • count_combined 用于统计可以形成 pattern 子序列的数量。

    • 每当遇到 pattern1 时,之前所有的 pattern0 都可以与之形成一pattern子序列,因此将 count_first 累加到 count_combined 中。

  2. 最大化子序列数量:

    • 通过在 text 中插入一个 pattern0,可以增加 count_second 个新的子序列。

    • 通过在 text 中插入一个 pattern1,可以增加 count_first 个新的子序列。

    • 取两者中的最大值作为结果。

  3. 返回结果:

    • 返回通过插入 pattern0 或 pattern1 后形成的最大子序列数量。

参考代码​:

复制代码
long long maximumSubsequenceCount(char* text, char* pattern) {
    long long count_first = 0;   // 记录 pattern[0] 出现的次数
    long long count_second = 0;  // 记录 pattern[1] 出现的次数
    long long count_combined = 0; // 记录可以形成的 'pattern' 子序列的数量
​
    // 遍历整个 text 字符串
    for (int i = 0; text[i] != '\0'; i++) {
        if (text[i] == pattern[1]) {
            // 如果当前字符是 pattern[1],那么之前出现的所有 pattern[0] 都可以与之形成一个 pattern 子序列
            count_combined += count_first; 
            count_second++; // 计数 pattern[1] 的出现次数
        }
        if (text[i] == pattern[0]) {
            // 计数 pattern[0] 的出现次数
            count_first++; 
        }
    }
​
    // 计算通过插入 pattern[0] 或 pattern[1] 可以得到的最大子序列数量
    long long max_count = count_first + count_combined; 
    long long test_count = count_second + count_combined;
​
    // 返回两者中的最大值
    return max_count > test_count ? max_count : test_count;
}

复杂度分析:

  • 时间复杂度: (O(n)),其中 (n) 是 text 的长度,因为我们只需遍历一次 text。

  • 空间复杂度: (O(1)),因为我们只使用了固定数量的额外变量来存储计数器。

相关推荐
纪念 2298 分钟前
C++ 算法基础 (差分)
开发语言·c++·算法
jyOverQ3 小时前
从零学 JVM(六):垃圾回收算法详解——标记清除、标记复制与标记整理
jvm·算法
ShineWinsu5 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
严肃小白兔5 小时前
第 06/24 期:神经网络的反向传播算法:从链式法则到梯度计算
人工智能·神经网络·算法
落羽的落羽5 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
【心态好不摆烂】6 小时前
数据结构基础精讲3
数据结构·算法
岑梓铭6 小时前
《考研408数据结构》第七章(B树 和 B+树)复习笔记
数据结构·笔记·b树·考研·408
漂流瓶jz7 小时前
UVA-1613 K度图的着色 题解答案代码 算法竞赛入门经典第二版
算法·深度优先·图论·贪心·aoapc·算法竞赛入门经典·uva
Pniubi8 小时前
动态规划入门 ( - 力扣509斐波那契数)
算法·动态规划