您的位置:首页 > 房产 > 家装 > b2c电商网站建设_上海网站推广定制_网站优化排名方案_企业品牌推广方案

b2c电商网站建设_上海网站推广定制_网站优化排名方案_企业品牌推广方案

2024/10/6 0:30:36 来源:https://blog.csdn.net/2302_77423323/article/details/142502479  浏览:    关键词:b2c电商网站建设_上海网站推广定制_网站优化排名方案_企业品牌推广方案
b2c电商网站建设_上海网站推广定制_网站优化排名方案_企业品牌推广方案

Problem: 2207. 字符串中最多数目的子序列

前面先是我的两次遍历的代码及思路,后面是学习灵神的思路写的一此遍历的改进。

思路

贪心:

本题主要思路就是贪心,我们需要在text中插入pattern的一个元素使能够找到最多的pattern串,其实不难发现pattern[0]插入位置越靠左,能和text串其他元素组成pattern的个数就越多,而pattern[1]插入位置越靠右能组成的个数也越多,那么把它们分别插入到头尾就是最贪的做法。

前缀和:

如何统计子序列的个数呢,需要分类讨论:

  1. 当在首部插入pattern[0]时,可以统计其前缀和cnt0,后面每次遍历到pattern[1]就能组成cnt0个序列。
  2. 对于尾部插入pattern[1]也是同样的道理。、
    到这里这道题也就解决了,我这个笨蛋思路就是统计两遍,但后来看了灵神题解才突然想到两次统计对于text中原始的pattern串的个数时重复统计的,不论是首插还是尾插,新增的序列的个数都是和新插入元素的组合,所以最后返回答案的时候加入一个最大的即可

一次遍历

class Solution {
public:long long maximumSubsequenceCount(string text, string pattern) {//插入pattern[0]在尽量靠前插入pattern[1]尽量靠后int cnt0 = 0, cnt1 = 0;long long ans = 0;for(char c : text){if(c == pattern[1]){ans += cnt0;cnt1++;}if(c == pattern[0]){cnt0++;}}return ans + max(cnt0, cnt1);}
};

笨蛋写法:

class Solution {
public:long long maximumSubsequenceCount(string text, string pattern) {//插入pattern[0]在尽量靠前插入pattern[1]尽量靠后int cnt0 = 1, cnt1 = 1;long long ans0 = 0, ans1 = 0;for(int i = 0; i < text.size();i++){ans0 += text[i] == pattern[1] ? cnt0 : 0;cnt0 += text[i] == pattern[0];}for(int i = text.size() - 1; i >= 0; i--){ans1 += text[i] == pattern[0] ? cnt1 : 0;cnt1 += text[i] == pattern[1];}return max(ans0, ans1);}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com