# 初始状态表示当前有0个字母, 0个A, 0个连续的字母L的方案数目为1
dp[0][0][0] = 1
mod = 10 ** 9 + 7
for i in range(n):
# 第二层表示字母A的数目
for j in range(2):
# 第三层表示连续字母L的数目
for k in range(3):
# 枚举的是下一个位置, 因为求解的是方案数目, 所以需要累加上当前状态的dp值
# 判断下一个位置填字母A的情况
if j == 0: dp[i + 1][j + 1][0] = (dp[i + 1][j + 1][0] + dp[i][j][k]) % mod
# 判断下一个位置为L的字母的情况
if k + 1 <= 2: dp[i + 1][j][k + 1] = (dp[i + 1][j][k + 1] + dp[i][j][k]) % mod
# 下一个位置为字母P一定合法所以直接计算即可
dp[i + 1][j][0] = (dp[i + 1][j][0] + dp[i][j][k]) % mod
res = 0
# 计算有n个字母所有的合法方案, 包含合法的字母A和字母L的情况
for j in range(2):
for k in range(3):
res = (res + dp[n][j][k]) % mod
return res
**java代码(232ms)**
public class Solution {
public int checkRecord(int n) {
int dp[][][] = new int[n + 1][2][3];
dp[0][0][0] = 1;
int mod = 1000000007;
for (int i = 0; i < n; ++i){
for (int j = 0; j < 2; ++j){
for (int k = 0; k < 3; ++k){
if (j == 0){
dp[i + 1][j + 1][0] = (dp[i + 1][j + 1][0] + dp[i][j][k]) % mod;
}
if (k + 1 <= 2){
dp[i + 1][j][k + 1] = (dp[i + 1][j][k + 1] + dp[i][j][k]) % mod;
}
dp[i + 1][j][0] = (dp[i + 1][j][0] + dp[i][j][k]) % mod;
}
}
}
int res = 0;
for (int j = 0; j < 2; ++j){
for (int k = 0; k < 3; ++k){
res = (res + dp[n][j][k]) % mod;
}
}
return res;
}
}
# 总结
大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](
)**
**麻烦帮忙转发一下这篇文章+关注我**
![就这一次!拼多多内部架构师培训Kafka源码笔记(现已绝版)](https://www.icode9.com/i/ll/?i=img_convert/988f458b2ba06064badc785d1db7148c.png)
> **本文已被[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)收录**
31330508235)]
> **本文已被[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)收录**