解题思路: 看到大家都用动态规划来解决的,我也在这里也写上一点动态规划的 相关知识~
1、递归思路: 从大范围/变量 -> 小范围/变量 来递推。 是从顶到底的一个思路
2、而动态规划: 先求小条件, -> 往大条件递推, 是从底到顶的 一个思路
用dp[i][j] =1 , 表示从i 到j 为回文子串。则可以列出状态转移方程
s[i] == s[j] && dp[i+1] [j-1] == 1;
dp[i][j] = {
0, s[i] != s[j] // 只符合这一个条件即可
#include <stdio.h>
int main(void) {
char str[351] = {0};
fgets(str, 351, stdin);
int length = strlen(str) -1;
int dp[350][350] = {0};
int max_ans = 1;
for(int i = 0; i < length; i++) {
dp[i][i] = 1;
if (i < length-1) {
if (str[i] == str[i+1]) {
dp[i][i+1] = 1;
max_ans = 2; // 将所有长度为2 的回文子串都遍历出来,并且将其放在表中
}
}
}
for (int L = 3; L <= length; L++) { //长度从3到 输入字符串长度
for (int i = 0; i< length -L +1; i++) { // 关于回文子串最后的起始位置 可以 实际赋值后计算, 否则很容易出错
int j = i+L-1; // 注意考虑前后回文子串节点
if ((str[i] == str[j]) && (dp[i+1][j-1] == 1)) {
dp[i][j] = 1;
max_ans = L;
}
}
}
printf("%d\n", max_ans);
return 0;
}