腾讯音乐校招2023
可爱串,我看不懂答案,但我大为震撼。
``
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) 取模,以保证结果在整数范围内并且避免溢出。