第九章 动态规划part17
-
- 回文子串
- 516.最长回文子序列
- 动态规划总结篇
java
class Solution {
public int countSubstrings(String s) {
int n = s.length();
// 创建动态规划表 dp[i][j] 表示从 i 到 j 的子串是否为回文串
boolean[][] dp = new boolean[n][n];
// 初始化回文子串计数器
int count = 0;
// 遍历所有可能的子串长度
for(int len = 1; len <= n; len++){
// 遍历所有可能的子串的起始位置
for(int i = 0; i < n - len + 1; i++){
// 计算子串的结束位置
int j = i + len -1;
// 当子串长度为1 时, 子串一定为回文串
if(len == 1){
dp[i][j] = true;
}
// 当子串长度为2时, 只需要判断首尾字符是否相同
else if(len == 2) {
dp[i][j] = s.charAt(i) == s.charAt(j);
}
// 对于更长的子串 首尾字符相同时 判断内部子串是否为回文串
else{
dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i+1][j-1];
}
// 如果当前子串是回文串 计数器加1
if(dp[i][j]){
count ++;
}
}
}
// 返回回文子串的总数
return count;
}
}