题目描述
现有一个字符串s,求s的最长回文子串的长度。
输入描述
一个字符串s,仅由小写字母组成,长度不超过
100
。
输出描述
输出一个整数,表示最长回文子串的长度。
样例1
输入
lozjujzve
输出
5
解释
最长公共子串为
zjujz
,长度为5
。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100;
int dp[MAXN][MAXN];
int main(){
string s;
cin >> s;
int ans = 1;//初始长度为1的字符串
int ls = s.length();
for(int i=0;i<ls;i++){
dp[i][i] = true;//只有一个字符的字符串
ans = 1;
if(i < ls -1 && s[i] == s[i+1]){//相邻两个字符相等的字符串
dp[i][i+1] = true;//表示s[i:i+1]是回文子串
ans = 2;//初始长度为2的字符串
}
}
for(int len=3;len<=ls;len++){
for(int i=0;i+len-1<=ls;i++){ //i遍历字符串s中所有可能的起始位置,使得字串长度为len
int j = i + len -1;//计算字串结束j的位置
if(s[i] == s[j] && dp[i+1][j-1] == true){//检查当前子串的两端字符是否相等以及去掉两端字符后子串是否为回文子串
dp[i][j] = true;//满足上述条件,则当前子串标记为回文子串
ans = len;//并更新最长回文子串长度
}
}
}
printf("%d",ans);
return 0;
}