题解 | #好多牛牛#

好多牛牛

http://www.nowcoder.com/practice/edced5e80f3e46efa9c965e7f634c58c

好多牛牛

给出一个字符串S,牛牛想知道这个字符串有多少个子序列等于"niuniu"
子序列可以通过在原串上删除任意个字符(包括0个字符和全部字符)得到。
为了防止答案过大,答案对1e9+7取模

案例
输入:"niuniniu"
返回值:3
说明:
删除第4,5个字符可以得到"niuniu"
删除第5,6个字符可以得到"niuniu"
删除第6,7个字符可以得到"niuniu"

方法一 动态规划

定义一个二维dp数组表示当到达s数组第i位时取到niuniu字符串第j位的所有子序列,然后考虑两种情况

  1. s字符串第i位与niuniu第j位相同时,说明当前的结果等于的方案数表示i之前能达到第j位的方案数加上第i位之前能达到第j-1位的方案数(因为第j位是由j-1位加上第j位得来的),转移式为
  2. s字符串第j位与niuniu第j位不同时,直接取前面能达到第j位的方案数也就是
    图片说明
class Solution {
public:
    long long dp[100010][10], mod = 1e9 + 7;
    string ss = " niuniu";
    int solve(string s) {
        // write code here
        int n = s.length();
        for(int i = 0; i <= n; i ++) dp[i][0] = 1;
        for(int i = 0; i < n; i ++){ //遍历s字符串
            for(int j = 1; j <= 6; j ++){ //遍历niuniu字符串
                if(ss[j] == s[i]) dp[i + 1][j] = dp[i][j] + dp[i][j - 1]; //如果当前s的字符与niuniu匹配
                else dp[i + 1][j] = dp[i][j]; // 如果不匹配
                dp[i + 1][j] %= mod;
            }
        }
        return dp[n][6];
    }
};

时间复杂度: 总复杂度为niuniu的长度乘s字符长度
空间复杂度: 最多会使用s字符串长度*niuniu字符串长度的空间

方法二 动态规划-空间压缩

该方法是方法一的优化,通过方法一的图片能发现每次只需要维护niuniu字符串长度的数组即可,对于每个s字符串i字符如果与niuniu第j位相同则将第j - 1位的方案数加上第j位的方案数即可转移式为:

class Solution {
public:
    long long dp[110000];
    long long mod = 1e9 + 7;
    string ss = "niuniu";
    int solve(string s) {
        // write code here
        dp[0] = 1;
        for(int i = 1; i <= s.length(); i ++){
            for(int j = 1; j <= 6; j ++){
                if(ss[j - 1] == s[i - 1]) { //如果相同则更新dp数组
                    dp[j] = (dp[j - 1] + dp[j]) % mod;
                }
            }
        }
        return dp[6];
    }
};

时间复杂度: 总复杂度为niuniu的长度乘s字符长度
空间复杂度: dp数组最多会用到niuniu字符串的长度

全部评论

相关推荐

#牛客帮帮团来啦!有问必答# 非吹牛逼非炫富,真实向各位大佬求助帖。本人简历上的的公司法人是自己,产品是自己独立开发的,但是担心创业经历会让HR抵触,所以将创业经历优化成实习经历,收入也写少了2/3(隐私信息打码)。进大厂是我中学至今的目标。苦于学历不行,所以决定专注提升履历,大一前便注册了一个高中教育公众号,一年涨了3万粉,月入过万,大学一直是经济独立。大二时攒下来10万,我开始创业做产品,是互联网教育/电商/新媒体等领域,大学三年赚了两百多万,前期是产品空白需求大,现在市场饱和,销量见顶,ROI低到经营困难,数据无法大幅度增长,履历的提升已经出现停滞,无法做出更大的业绩来够到进大厂的门槛。我一开始以为创业是加分项,负债的风险和创业的压力(疫情断货、恶意扣分罚款、背刺、竞对攻击等很多生死存亡的节点都让人焦虑痛苦和失眠)是我不想经历第二次的,因为没有合伙人,只能白天上课,晚上熬夜工作,每天睡5,6小时。没想到创业的经历,会有很多HR怀疑我的求职动机,给我带来很多阻挠。不求工资多少,城市哪里,在职场里发展3-5年以上是我坚定不移的人生规划,只为提高自己未来的下限。所以来到牛客向各位大佬求助。看看简历有什么要优化的,怎么写才有机会进大厂,感激不尽! #投递实习岗位前的准备# #找实习多的是你不知道的事# #实习,投递多份简历没人回复怎么办# #没有实习经历,还有机会进大厂吗#
ITTM:首先给大佬敬礼,然后建议是把工作经历和项目经历挪到最上面,这两个是面试时面试官的谈资,然后教育背景要放在最上面,自我评价一般是放最后的。另外,项目经历按照时间倒序排列,最近做的放在前面
点赞 评论 收藏
分享
人醒着就会困:直接回答,"你刚才提到你是百度JAVA,那么你相对于字节JAVA的优势在哪里?"
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务