动态规划来填表!分几步。
第一步:检验填表顺序对不对
class Solution {
public:
string longestPalindrome(string s) {
int dp[s.size()][s.size()];
memset(dp,0,sizeof(dp));
int start = 0, max = 0;
// 填数
for(int t=1; t<s.size(); t++){
for(int i=0; i<s.size()-t; i++){
dp[i][i+t] = t;
}
}
// 打印
for(int i=0; i<s.size(); i++){
for(int j=0; j<s.size(); j++){
cout << dp[i][j] << " ";
}
cout << endl;
}
return "";
}
};
打印结果:(表明填表顺序是对的)
0 1 2 3 4
0 0 1 2 3
0 0 0 1 2
0 0 0 0 1
0 0 0 0 0
第二步:开始填表
class Solution {
public:
string longestPalindrome(string s) {
int dp[s.size()][s.size()];
memset(dp,0,sizeof(dp));
int start = 0, max_len = 0;
for(int t=0; t<s.size(); t++){
for(int i=0; i<s.size()-t; i++){
// 前后相同,为1
if(s[i] == s[i+t]){
dp[i][i+t] = 1;
}
// 里面不同,为0
if(t>=2 && dp[i+1][i+t-1]==0){
dp[i][i+t] = 0;
}
// 判断最大长度
if(dp[i][i+t]==1 && t>max_len){
start = i;
max_len = t;
}
}
}
// for(int i=0; i<s.size(); i++){
// for(int j=0; j<s.size(); j++){
// cout << dp[i][j] << " ";
// }
// cout << endl;
// }
// cout << start << " " << start+max_len << endl;
return s.substr(start, max_len+1);
}
};