难度:中等。
知道是动态规划,但好久没写代码有点忘了,看了下思路,如下:
使用res[i][j]表示s[i]到s[j]是否为回文,则
当 s[i] == s[j] 时,res[i][j] = res[ i+1 ][ j-1 ]
否则,res[i][j] = 0
边界取值:
res[i][i] = 1;
若s[i] == s[j], 则res[i][i+1] = 1,否则res[i][i+1] = 0
计算时第一层循环为遍历步长,第二层遍历i的取值。
正确解法:
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
int res[1001][1001];
int max_num = 1, start = 0, end = 0;
string max_str = "";
if(len == 0){
return max_str;
}
else if(len == 1){
return s;
}
max_str = s.substr(0, 1);
for(int i = 0; i < len; i++){
res[i][i] = 1;
if(i < len - 1){
if(s[i] == s[i+1]){
res[i][i+1] = 1;
}
else{
res[i][i+1] = 0;
}
if(res[i][i+1] == 1 && max_num < 2){
max_num = 2;
start = i;
end = i + 1;
max_str = s.substr(i, 2);
}
}
}
cout << max_str << endl;
for(int k = 2; k < len; k++){
for(int i = 0; i < len - k; i++){
int j = i + k;
if(s[i] == s[j]){
res[i][j] = res[i+1][j-1];
}
else{
res[i][j] = 0;
}
if(res[i][j] == 1 && max_num < k + 1){
max_num = k + 1;
start = i;
end = j;
max_str = s.substr(i, k + 1);
}
}
}
// cout << "[" << start << "," << end << "]\nmaxnum: " << max_num << endl;
return max_str;
}
};