LeetCode 2207. 字符串中最多数目的子字符串

题目链接:

力扣icon-default.png?t=M276https://leetcode-cn.com/problems/maximize-number-of-subsequences-in-a-string/

【分析】由于pattern中只有两个字符,假设分别是a、b,只需要统计出text中每个a后面有多少b即可,这儿这个通过后缀和的思想,先算出总的b的个数,如果当前字符是a,那么后面b的个数就是总的b的个数,如果是b,就把总的b的个数-1。由于最后还可以插入一个a或者b,显然插在两端的时候会使总的个数增加最多。如果在前面插入a,则这个a可以和总的b组成pattern,总个数增大b;如果在后面插入b,则这个b可以组成a个pattern,所以最后在答案加一个a和b总数的最大值即可。

另外对于a==b的情况来说,假设aaaa,那么可以组成aa的情况有3+2+1种,最后再+4即a的总个数,用等差数列求和公式即可,但是一定要注意算乘法的时候先转long,否则会溢出。

class Solution {
    public long maximumSubsequenceCount(String text, String pattern) {
        char a = pattern.charAt(0), b = pattern.charAt(1);
        int n = text.length(), i;
        int x = 0, y = 0, t = 0;
        long ans = 0;
        char c;
        if(a == b){
            for(i = 0; i < n; i++){
                if(text.charAt(i) == a) x++;
            }
            return (long)(x + 1) * x / 2;
        }
        for(i = 0; i < n; i++) {
            if(text.charAt(i) == a) x++;
            else if(text.charAt(i) == b) y++;
        }
        int m = y;
        for(i = 0; i < n; i++){
            if(text.charAt(i) == a) ans += y;
            else if(text.charAt(i) == b) y--;
        }
        return ans + Math.max(x, m);
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值