题目描述:
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
解题分析:
采用动态规划,dp[i][j]表示从下标i到下标j的位置是否是回文串。具体的考虑三种情况:
- i = j,dp[i][j] = true;
- j-i == 1, 且A[i] = A[j], dp[i][j] = true;
- A[i] = A[j],dp[i][j] = dp[i+1][j-1]
注意for循环的层次关系。
class Solution {
public:
int getLongestPalindrome(string A, int n) {
// write code here
if(n==0)
return 0;
int ans=0;
vector<vector<int>> dp(n, vector<int>(n));
dp[0][0]=true;
for(int right=1; right<n; ++right){
for(int left=0; left<n; ++left){
if(left>right || A[left]!=A[right]){
continue;
}
if(left==right){
dp[left][right]=true;
}
else if(right-left==1){
dp[left][right]=true;
}
else{
dp[left][right]=dp[left+1][right-1];
}
if(dp[left][right])
ans=max(ans, (right-left+1));
}
}
return ans;
}
};