【教3妹学编程-算法题】重新排列后包含指定子字符串的字符串数目
  96AOqGW9dKgh 2023年12月08日 37 0


【教3妹学编程-算法题】重新排列后包含指定子字符串的字符串数目_字符串

3妹:1 8得8,2 8=16, 3 8妇女节…
2哥 : 3妹,在干嘛呢
3妹:双11不是过了嘛, 我看看我这个双十一买了多少钱, 省了多少钱。
2哥 : 我可是一分钱没买。
3妹:我买了不少东西, 衣服、包包、化妆器……, 接下来的一个月只能吃土了, 还要2哥救助~
2哥:你没有用花呗或信用卡吗, 把支付方式重新排列一下, 用最晚还款的那种信用卡,这样就可以暂时不用吃土啦。
3妹:可是后面还是要还信用卡啊。
2哥 : 傻啊你, 后面就发工资了啊, 不就缓解了
3妹:咦,有道理啊
2哥:说到重新排列支付方式,我今天看天一个重新排列的题目,我们来做一下吧~

【教3妹学编程-算法题】重新排列后包含指定子字符串的字符串数目_深度优先_02

题目:

给你一个整数 n 。

如果一个字符串 s 只包含小写英文字母,且 将 s 的字符重新排列后,新字符串包含 子字符串 “leet” ,那么我们称字符串 s 是一个 好 字符串。

比方说:

字符串 “lteer” 是好字符串,因为重新排列后可以得到 “leetr” 。
“letl” 不是好字符串,因为无法重新排列并得到子字符串 “leet” 。
请你返回长度为 n 的好字符串 总 数目。

由于答案可能很大,将答案对 109 + 7 取余 后返回。

子字符串 是一个字符串中一段连续的字符序列。

示例 1:

输入:n = 4
输出:12
解释:总共有 12 个字符串重新排列后包含子字符串 “leet” :“eelt” ,“eetl” ,“elet” ,“elte” ,“etel” ,“etle” ,“leet” ,“lete” ,“ltee” ,“teel” ,“tele” 和 “tlee” 。
示例 2:

输入:n = 10
输出:83943898
解释:长度为 10 的字符串重新排列后包含子字符串 “leet” 的方案数为 526083947580 。所以答案为 526083947580 % (109 + 7) = 83943898 。

提示:

1 <= n <= 10^5

思路:

【教3妹学编程-算法题】重新排列后包含指定子字符串的字符串数目_java代码_03

把字母当成数字,这就是一道弱化版的数位DP

java代码:

class Solution {

    public int stringCount(int n) {
        this.n = n;
        int all = 1 << 4;
        memo = new int[n][all];
        for (int i = 0; i < n; i++) {
            Arrays.fill(memo[i], -1);
        }
        return dfs(0, all - 1);
    }

    int mod = (int) (1e9 + 7);
    int n;

    int[][] memo;

    private int dfs(int i, int mask) {

        if (i == n) {
            return mask == 0 ? 1 : 0;
        }

        if (memo[i][mask] != -1) {
            return memo[i][mask];
        }

        int res = 0;
        for (char j = 'a'; j <= 'z'; j++) {

            if ((mask & 1) == 1 && j == 'l') {
                res =(res + dfs(i + 1, mask ^ 1)) % mod;
            } else if ((mask & 2) != 0 && j == 'e') {
                res = (res + dfs(i + 1, mask ^ 2)) % mod;

            } else if ((mask & 4) != 0 && j == 'e') {
                res = (res + dfs(i + 1, mask ^ 4)) % mod;

            } else if ((mask & 8) != 0 && j == 't') {
                res = (res + dfs(i + 1, mask ^ 8)) % mod;

            } else {
                res = (res + dfs(i + 1, mask)) % mod;
            }


        }
        return memo[i][mask] = res;
    }
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月08日 0

暂无评论

推荐阅读