leetcode 周赛补题(2020/4/19)

第一次参加leetcode竞赛,好吧我是真菜

数青蛙

题目链接

题目描述

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 “croak” )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
注意:要想发出蛙鸣 “croak”,青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。
如果字符串 croakOfFrogs 不是由若干有效的 “croak” 字符混合而成,请返回 -1 。

思路

想半天的题竟然这么简单??
思路就很简单,就是遍历发现后面的字符出现的次数大于前面的了,就返回-1,然后等到’k’字符就消消乐。青蛙的个数就是剩下的’c’字符数目。

代码

class Solution {
public:
    int minNumberOfFrogs(string s) {
        int c=0,r=0,o=0,a=0,k=0;
        int maxi = 0;
        for(char x:s)
        {
            if(x=='c')
                c++;
            else if(x=='r')
                r++;
            else if(x=='o')
                o++;
            else if(x=='a')
                a++;
            else if(x=='k')
                k++;
            else return -1;
            if(r>c||o>r||a>o||k>a)
                return -1;
            if(k==1)
            {
                c--;
                r--;
                o--;
                a--;
                k--;
            }
            maxi = max(maxi,c);
        }
        if(c)
           return -1;
        return maxi;
    }
};

生成数组

题目描述

题目链接
在这里插入图片描述

思路

就一个三维dp,dp[n][i][k]表示在数组长度为n,数组最大值为i,search_cost=k情况下的生成数组数目。易知dp[1][i][1]=1。对于任意p,q,r,dp[p][q][r]可由两个部分相加得到,一是最大值q放在数组末尾,这种情况下的生成数组数目为sum(dp[p-1][j][r-1]),j从1到q-1。然后是最大值q放在数组前n-1的任意位置,这种情况下生成数组的数目为q*dp[p-1][q][r]。

代码

const long long MOD = 1e9+7;
class Solution {
public:
    int numOfArrays(int n, int m, int k) {
        long long dp[60][110][60];
        for(int i=1;i<=m;i++)
        {
            dp[1][i][1] = 1;
        }
        for(int p=2;p<=n;p++)
        {
            for(int q=1;q<=m;q++)
            {
                for(int r=1;r<=p&&r<=k;r++)
                {
                    dp[p][q][r] = (q*dp[p-1][q][r])%MOD;
                    for(int j=1;j<=q-1;j++)
                    {
                        dp[p][q][r]+=dp[p-1][j][r-1];
                        dp[p][q][r] %= MOD;
                    }
                }
            }
        }
        long long ans = 0;
        for(int i=1;i<=m;i++)
        {
            ans+=dp[n][i][k];
            ans%=MOD;
        }
        return ans;
    }
};
原创文章 39 获赞 5 访问量 4919

猜你喜欢

转载自blog.csdn.net/q1072118803/article/details/105625433