思路:
dp[i][j]表示s[i]到s[j]的子串是否為回文。
如果s[i+1]到s[j-1]是回文串,那么再加上條件:s[i]==[j],則dp[i][j]為true。算法的時間復雜度依舊為O(N^2),但減少了重復計算的部分。
狀態轉移方程:
初始情況:
dp[i][i]=1
dp[i][i+1]=1 if str[i]==str[i+1]
單個字符,相鄰字符相同都是回文串。
代碼:
int longestPalindrome(char* s, int len)
{
if (s == NULL || len <= 0)
return 0;
if (len == 1)
return 1;
int longest = 1;
int start = 0;
vector<vector<bool>> dp(len,vector<bool>(len)); //外層和內層大小都是len
for (int i = 0; i < len; i++) //初始情況 兩種
{
dp[i][i] = 1;
if (i < len - 1)
{
if (s[i] == s[i + 1])
{
dp[i][i + 1] = 1;
start = i;
longest = 2;
}
}
}
for (int l = 3; l <= len; l++) //子串長度 狀態轉移的時候長度不斷變長.
{
for (int i = 0; i + l - 1< len; i++)//保證右邊界不越界
{
int j = i + l - 1; //子串右邊界
if (dp[i + 1][j - 1] && s[i] == s[j])
{
dp[i][j] = 1;
start = i;
longest = l;
}
}
}
return longest;
}