解題思路
使用動態規劃的思想通過此題
狀態方程爲
s表示該字符串,dp[i][j]表示i到j是否爲迴文串,是則爲1,不是則爲0
dp[i][j]=
{
dp[i+1][j-1],s[i]==s[j]
0,s[i]!=s[j]
}
代碼
class Solution {
public:
string longestPalindrome(string s) {
int slen = s.size();//字符串長度
int ans = 1;//存儲迴文串長度
int left = 0;//迴文串的左右下標
int count = 0;//取下標小的迴文串
//邊界
const int maxn = 1000;//申請的過大會導致棧溢出Stack Overflow
int dp[maxn][maxn];///默認爲0,0表示dp[i][j]不爲迴文串,1表示爲迴文串
memset(dp, 0, sizeof(dp));//初始化爲0
for (int i = 0; i < slen; i++)
{
dp[i][i] = 1;//i到i爲迴文串
if (s[i]==s[i+1])
{
dp[i][i + 1] = 1;
ans = 2;
if (count==0)
{
left = i;
count = 1;
}
}
}
//狀態轉移方程
for (int Len = 3; Len <= slen; Len++)
{
count = 0;
for (int i = 0; i < slen-Len+1; i++)
{
int j = i + Len - 1;
if (s[i]==s[j]&&dp[i+1][j-1])
{
dp[i][j] = 1;
ans = Len;
if (count == 0)
{
left = i;
count = 1;
}
}
}
}
//輸出答案
return s.substr(left,ans);
}
};