小红定义一个字符串是可爱串,当且仅当该字符串包含子序列“red“,且不包含子串“red“。 我们定义子序列为字符串中可以不连续的一段,而子串则必须连续。例如rderd包含子序列“red“,且不包含子串

文章介绍了腾讯音乐2023年校招中一道编程题目,涉及计算给定字符串长度下,不包含子串red但包含子序列red的字符串数量,通过f数组和h数组进行计算,使用取模操作处理大数问题。
摘要由CSDN通过智能技术生成

可爱串,我看不懂答案,但我大为震撼。

``

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    public int kawaiiStrings (int n) {
        // write code here
        long mod=(long)Math.pow(10,9)+7;
        long[] f=new long[n+1];
        long[] g=new long[n+1];
        long[] h=new long[n+1];
        for(int i=2;i<=n;i++){
            g[i]=(g[i-1]*2)%mod+((i-1)*powMod(2,i-2,mod))%mod;
            g[i]%=mod;
        }
        for(int i=2;i<=n;i++){
            f[i]=(f[i-1]*3)%mod+g[i-1]%mod;
            f[i]=(f[i-1]*3)%mod+g[i-1]%mod;
            f[i]%=mod;
        }
        for(int i=3;i<=n;i++){
            h[i]=powMod(3,i-3,mod)+3*h[i-1]%mod+mod-h[i-3];
            h[i]%=mod;
        } 
        return (int)((f[n]+mod-h[n])%mod);   
            
            }
    public static long powMod(long a, long b,long mod){
        long m=a;
        long n=b;
        long res=1;
        while(n>0){
            if((n&1)==1){
                res=res*m%mod;
                res%=mod;
            }
            n>>=1;
            m=m*m%mod;
        }
        return res;
    }
}

``

  • g 数组: g 数组用于计算在长度为 (i) 的字符串中,包含子序列 “red” 的所有可能字符串的数量。这里的计算并不排除那些直接包含
    “red” 子串的字符串。因此,g 数组的值代表一个中间步骤,它包括了最终解的一部分,但也包括了需要被排除的情况。

  • f 数组: f 数组用于计算在长度为 (i) 的字符串中,由 ‘r’、‘e’、‘d’
    任意组合而成的所有可能字符串的数量。这个计算结果包括了所有情况,不仅仅是那些包含子序列 “red” 的字符串。因此,f 数组代表了一个更广泛的范围,它是问题解的上界。

    h 数组: h 数组专门用于计算在长度为 (i) 的字符串中,直接包含子串 “red” 的字符串数量。因为题目要求的是那些包含子序列 “red” 但不包含子串 “red” 的字符串,所以 h 数组的值代表需要从 f 数组的结果中排除的那部分情况。

    最终,问题的解可以通过计算 f 数组中的值(即所有可能的字符串)减去 h 数组中的值(即不满足条件的字符串数量,也就是包含 “red”
    子串的字符串数量),从而得到满足条件的字符串数量。这个过程需要对 (10^9 + 7) 取模,以保证结果在整数范围内并且避免溢出。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰米的大鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值