首页 > 其他分享 >力扣题解2207

力扣题解2207

时间:2024-09-24 19:23:42浏览次数:10  
标签:count 字符 2207 题解 long 力扣 text 序列 pattern

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

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

题目描述(中等)​:

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

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

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

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

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

题目分析:

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

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

解题思路:

  1. 计数:

    • 遍历 text,统计 pattern[0] 和 pattern[1] 的出现次数。

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

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

  2. 最大化子序列数量:

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

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

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

  3. 返回结果:

    • 返回通过插入 pattern[0] 或 pattern[1] 后形成的最大子序列数量。

参考代码​:

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)),因为我们只使用了固定数量的额外变量来存储计数器。

标签:count,字符,2207,题解,long,力扣,text,序列,pattern
From: https://blog.csdn.net/wxdzuishaui/article/details/142496946

相关文章

  • 【洛谷】P2261 [CQOI2007] 余数求和 的题解
    【洛谷】P2261[CQOI2007]余数求和的题解洛谷传送门题解这还是蓝题,这还是省选qaq题目看着很简单,但是真的很考验思路,思路对了,代码不到555分钟写完。刚开始做的时......
  • 题解:SP1741 TETRIS3D - Tetris 3D
    题意维护一个\(D\timesS\)的平面,每个点有一个高度。要求支持一个操作:查询一个矩形区域的最大值,并将该区域更新为最大值加上给定的数。分析发现\(D,S\leq10^3\),考虑使用二维线段树维护。二维线段树,顾名思义,就是在普通线段树的每一个节点上维护一棵线段树。在本题中,外层节......
  • 题解:P10950 太鼓达人
    分析显然答案包含长度为\(K\)的所有\(01\)串,每个串和前一个的重叠长度为\(K-1\),所以每个串对长度的贡献为\(1\)。因此该串的长度为所有\(01\)串的个数,即\(2^K\)。考虑第二个如何解决。发现每个位置的状态只有\(0\)和\(1\),考虑爆搜。显然直接搜的复杂度为\(O(2^......
  • 题解:P5184 [COCI2009-2010#2] PASIJANS
    分析考虑贪心,每次尽量选最小的字符。显然是每次选字典序最小的弹栈。我们要比较的是每个栈的字典序,但是朴素比较是\(O(L)\)的,考虑将它优化到\(O(1)\)。这个时候我们可以先离散化然后套路地将所有串拼一起跑SA。记得在每个串之间加分割符。这样每次比较字典序就变成了\(......
  • 题解:P6351 [PA2011] Hard Choice
    题意维护一张无向图,要求支持以下操作:切断一条边。查询两个点是否有有两条完全不同的路径相连。分析因为断边操作不好维护,考虑离线后将断边变为加边。因此,我们只需要维护加边操作即可。考虑使用LCT。首先,因为涉及到边权,套路地用节点代替边。如果某一条边连接的两个点......
  • ABC245G Foreign Friends 题解 / 二进制分组
    ABC245GForeignFriends题解回顾一下二进制分组。题目大意给定一张\(N\)个点\(M\)条边的无向图,及\(L\)个特殊点。每个点有颜色\(C_i\)。求每个点到离他最近的与他颜色不同特殊点的距离。Solve两个点颜色不同,等价于他们的颜色在二进制下至少有一位不同。所以我们考......
  • MySQL GROUP BY 分区大小写问题解析
    在数据库操作中,GROUPBY是一个常用的SQL语句,用于根据一个或多个列的值对结果集进行分组。然而,在使用MySQL时,你可能会遇到一个常见问题:大小写敏感性。本文将探讨MySQL中GROUPBY的大小写敏感性问题,并提供一些解决方案。什么是大小写敏感性?在计算机科学中,大小写敏感性是指......
  • Codeforces Round 974 (Div.3) 题解
    CodeforcesRound974(Div.3)题解A.RobinHelps模拟按照题意模拟即可。voidShowball(){intn,k;cin>>n>>k;intcur=0,ans=0;for(inti=0;i<n;i++){intx;cin>>x;if(x>=k)cur+=x;elseif(!x){if(cur>=1)cu......
  • AT_jsc2021_g Spanning Tree 题解
    感觉自己稍微有一点唐了。思路我们首先可以把一定要连的边连起来。这样就变成了一个无向图生成树计数问题。如何求解。使用矩阵树定理!我们可以求出基尔霍夫矩阵,然后跑一遍行列式就可以了。时间复杂度:\(O(n^3)\)。Code#include<bits/stdc++.h>usingnamespacestd;con......
  • 2207. 字符串中最多数目的子序列
    给你一个下标从0开始的字符串text和另一个下标从0开始且长度为2的字符串pattern,两者都只包含小写英文字母。你可以在text中任意位置插入一个字符,这个插入的字符必须是pattern[0]或者pattern[1]。注意,这个字符可以插入在text开头或者结尾的位置。请你返回插......