欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 2207. 字符串中最多数目的子字符串(前缀和)

发布时间:2024/7/5 编程问答 70 豆豆
生活随笔 收集整理的这篇文章主要介绍了 LeetCode 2207. 字符串中最多数目的子字符串(前缀和) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 1. 题目
    • 2. 解题

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. 解题

  • 首先可以求出每个位置左侧的 0 字符、右侧的 1 字符个数
  • 接着求出不插入新字符的情况下有多少种子序列
  • 再求出插入一个新字符会增加多少个子序列,两者的和就是答案
class Solution { public:long long maximumSubsequenceCount(string text, string pattern) {int n = text.size(), delta = 0;long long ans = 0;vector<int> left0(n), right1(n);for(int i = 0; i < n; ++i)left0[i] = (i>0 ? left0[i-1] : 0) + (text[i]==pattern[0]);for(int i = n-1; i >= 0; --i)right1[i] = (i<n-1 ? right1[i+1] : 0) + (text[i]==pattern[1]);for(int i = 0; i < n; ++i){if(text[i] == pattern[1])ans += i>0 ? left0[i-1] : 0;//原有多少种子序列delta = max(delta, max(right1[i], left0[i]));// 增加字符后最大的可能}return ans+delta;} };

76 ms 35.5 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

总结

以上是生活随笔为你收集整理的LeetCode 2207. 字符串中最多数目的子字符串(前缀和)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。