LeetCode-5-最长回文子串
/*最长回文子串*/
#include<iostream>
#include<string>
using namespace std;
char str[1001];
int dp[1001][1001];//dp[i][j]表示从i到j的这段字符串是不是回文串,是为1,不是为0
void main(){
cin>>str;
int sum = 1;//回文子串的最大长度
//初始化
int len = strlen(str);
for (int i = 0; i < len; i++){
for (int j = 0; j < len; j++){
dp[i][j] = 0;
}
dp[i][i] = 1;
if (i<len-1&&str[i] == str[i + 1]){//两个字母相等回文
dp[i][i + 1] = 1;
}
}
//动态规划
int start, end,maxlen=0;
for (int i = 0; i < len; i++){
for (int j = 0; j <= i; j++){//动规判断dp[j][i]是不是回文,若是为1,不是为0
if (i - j < 2){//当子串的长度为1时,只有一个字符必为回文,当子串的长度为2时若两个字母相等也为回文
dp[j][i] = (str[j] == str[i]);
}
else if (i - j >= 2){//当子串长度>2时,若当前str[i]==str[j],那么若i+1到j-1是回文,即是回文,否则不是回文
dp[j][i] = (str[j] == str[i]) && (dp[j + 1][i - 1]);
}
if (dp[j][i] && maxlen < i - j + 1){
maxlen = i - j + 1;
start = j;
end=i;
}
}
}
//输出最长回文子串
for (int i = start; i <= end; i++){
cout << str[i];
}
cout << endl;
}