一、普通方法:
设要判断的字符串是s,依次扫描s[i]~s[i+k]是否为回文子串,其中0<=i<=len-1,0<=i+k<=len-1,1<=k<=len,利用动态规划的思路:
即:若s[i][i+k]为回文子串,只需要s[i+1][i+k-1]是回文子串并且s[i]=s[i+k],
写成状态转移方程如下:
所以有如下的代码:
string longestPalindrome(string s) {
int len = s.length();
int** record = new int*[len];
for (int i = 0; i < len; i++) {
record[i] = new int[len];
}
//初始化序列
for (int i = 0; i < len; i++) {
record[i][i] = 1;
}
string sub = s.substr(0, 1);
for (int i = 0; i + 1 < len; i++) {
if (s[i] == s[i + 1]) {
record[i][i + 1] = 1;
sub = s.substr(i, 2);
}
else {
record[i][i + 1] = 0;
}
}
for (int k = 2; k < len; k++) {//要判断的字符串长度,从3到len
bool flag = false;
for (int i = 0; i+k < len; i++) {//下标从i开始
if (s[i] == s[i + k]) {
record[i][i + k] = record[i + 1][i + k - 1];
if (flag == false&& record[i][i + k]==1) {
flag = true;
sub = s.substr(i, k+1);
}
}
else
record[i][i + k] = 0;
}
}
return sub;
}