首页 > 其他分享 >统计一个字符串的 k 子序列美丽值最大的数目

统计一个字符串的 k 子序列美丽值最大的数目

时间:2023-09-03 20:45:34浏览次数:40  
标签:end int res 序列 字符串 数目 dp MOD

k 子序列指的是 s 的一个长度为 k 的 子序列 ,且所有字符都是唯一的,也就是说每个字符在子序列里只出现过一次。
定义 f(c) 为字符 c 在 s 中出现的次数。
k 子序列的 美丽值定义为这个子序列中每一个字符 c 的f(c)之和

1. 贪心 + 组合枚举

贪心选美丽值最大的字符,对于最后美丽值相同的,进行组合计算

class Solution {
public:
    const int MOD = 1e9 + 7;
    int countKSubsequencesWithMaxBeauty(string s, int k) {
        vector<int> dp(26);
        for(int i=0;i<s.size();i++)
            dp[s[i]-'a']++;
        sort(dp.begin(),dp.end());
        if(k>26||dp[26-k]==0) return 0;
        //要使得最大,序列中最小的数进行任意组合
        long long res = 1;
        int target = dp[26-k];//最小的值
        auto start = lower_bound(dp.begin(),dp.end(),target);
        auto end = upper_bound(dp.begin(),dp.end(),target);
        vector<int> combo(start,end); 
        int m = k - (dp.end() - end); //最小的数里面选m个
        for(int i=25;i>=26-(k-m);i--)  //后面的数选k-m个
            res = (res * dp[i])%MOD;
        //从combo中选出m个数组合
        long long rest = 0;
        for(int mask=0;mask<(1<<combo.size());mask++){
            if(__builtin_popcount(mask)==m){
                long long cur = 1;
                for(int i=0;i<combo.size();i++)
                     if ((mask >> i) & 1) cur = (cur * combo[i])%MOD;
                rest += cur;
            }
        }
        res = (res * (rest%MOD))%MOD;
        return  res;
    }
};

标签:end,int,res,序列,字符串,数目,dp,MOD
From: https://www.cnblogs.com/929code/p/17675540.html

相关文章

  • 字符串操作函数2
    strncat的用法,注意要追加\0。intmain(){ //strncmp字符串比较函数 constchar*p1="abcdef"; constchar*p2="abcqwer"; intret=strncmp(p1,p2,3); printf("%d\n",ret); return0;}intmain(){ char*p1="abcdef"; char......
  • Java反序列化:CommonsCollections6调试分析
    JDK8u71大版本中AnnotationInvocationHandler.readObject被修改了,为了使得CC1能够利用,又造了一条CC6CC6解决的是CC1在高版本jdk上无法利用的问题这里搬一下web佬Boogipop的整理图:环境搭建JDK测试版本:JDK11基础知识1.CC1和CC6的恶意代码执行触发链再来捋顺一下这条恶......
  • *【学习笔记】(21) Prufer 序列
    Prufer序列Prufer序列可以将一个带标号\(n\)个节点的树用\([1,n]\)中的\(n-2\)个整数表示,即\(n\)个点的完全图的生成树与长度为\(n-2\)值域为\([1,n]\)的数列构成的双射。Prufer序列可以方便的解决一类树相关的计数问题,比如凯莱定理:\(n\)个点的完全图的生成树有......
  • Java:commons-codec实现byte数组和16进制字符串转换
    目录commons-codec实现原理封装StringUtil类commons-codec文档https://commons.apache.org/proper/commons-codec/https://mvnrepository.com/artifact/commons-codec/commons-codec坐标<dependency><groupId>commons-codec</groupId><artifactId>com......
  • Java使用有限状态机算法实现判断字符串是否合法
    题目描述请根据给出的正则表达式来验证邮箱格式是否合法,如果用户输入的格式合法则输出「邮箱格式合法」,否则输出「邮箱格式不合法」。正确格式对应的正则表达式"[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+";输入:[email protected]输出:邮箱格式合法分析最容易想到的是正则表达......
  • 剑指 Offer 57 - II. 和为s的连续正数序列(简单)
    题目:classSolution{public:vector<vector<int>>findContinuousSequence(inttarget){//本题使用滑动窗口(双指针)inti=1,j=1;//定义左右边界,一般是左闭右开intsum=0;//窗口内的和vector<vector<int>>result;whi......
  • 时间序列预测 | Matlab 粒子群优化长短期记忆网络(PSO-LSTM)的时间序列预测
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • Leetcode 剑指 Offer 58 - II. 左旋转字符串(Zuo xuan zhuan zi fu chuan lcof)
    题目链接字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例1:输入:s="abcdefg",k=2输出:"cdefgab"示例2:输入:s=......
  • # yyds干货盘点 # 分享一个Python字符串替换的基础题目(中篇)
    大家好,我是皮皮。一、前言上一篇文章,【瑜亮老师】引申了下字符串处理的题目,如下所示:扩展一下,下面的结果是什么:strs='abbacabbc'print(strs.strip('ab'))二、实现过程这里【王子】还是有点东西的,全部都回答正确了。那么再扩展下呢?你能够回答的出来吗?下一篇文章,我们揭晓答案。三、......
  • 剑指 Offer 44. 数字序列中某一位的数字(中等)
    题目:classSolution{//本题单纯找规律,要注意通过n%digits来判断有几个位数为digits的数public:intfindNthDigit(intn){longbase=9,digits=1;//digits代表位数while(n-base*digits>0){//该循环是为了确定目标数字所在数num......