漂亮串那题
楼主当时的解法超时了。写完才发现是 10^6的规模
因此需要O(n)解法才不超时
class Solution {
// G(n) 代表 长度为n的字符串中不同的漂亮串的个数
// N(n) 代表 长度为n的字符串中不出现任何red子串的个数
// G(n)可以拆解成以下两部分:
// 当前 n-1个字符形成了漂亮串时: 此时 形成了 G(n-1)*26个新的满足要求的串。
// 当前 n-1个字符没有形成漂亮串时:因为多出来的一个字符,有可能与前面两个字符串形成 red,此时就要求 前 n-3 个字符有且只有一个red
// 因此我们需要求前 n-3 个字符串中 有且仅有一个red的不同字符串个数:
// 这个等于 前 n-3 个字符串的所有种类, 减去 前n-3个字符串中所有漂亮字符串个数,再减去 n-3个字符串中 所有不存在的red子串的个数,即N(n)
// 即 = 26^(n-3) - G(n-3) - N(n-3)
// 另外 N(n) 可以通过递推公式 N(n) = N(n -1)*26 - N(n-3)得到
public int getres(int n) {
Long MOD = 1000000007L;
ArrayList<Long> G = new ArrayList<>();
ArrayList<Long> N = new ArrayList<>();
ArrayList<Long> P = new ArrayList<>();
N.addAll(Arrays.asList(1L,26L,26*26L));
G.addAll(Arrays.asList(0L,0L,0L,0L,0L,0L));
P.add(1L);
for(int i=3;i<=n;i++){
N.add((N.get(i-1)*26 - N.get(i-3))%MOD);
}
// 26的几次幂 列表
for(int i=0;i <n;i++){
P.add(P.get(i)*26 %MOD);
}
for(int i=6;i<=n;i++){
G.add((G.get(i-1)*26 + P.get(i-3) - G.get(i-3) - N.get(i-3)) % MOD);
}
return (int)((G.get(n)+MOD)%MOD);
}
}
#java##京东##笔试##后端#