LeetCode 5 最長迴文子串
阿新 • • 發佈:2020-07-30
題目描述連結:https://leetcode-cn.com/problems/longest-palindromic-substring/
解題思路:動態規劃問題。
(1)狀態標識dp[i][j]=0標識s[i]到s[j]這個子序列不為迴文子串,dp[i][j]=1標識其為迴文子串
(2)邊界,對於長度為1的子串肯定為迴文子串即dp[i][i]=1,長度為2的子串dp[i][i+1]= (s[i]==s[i+1])
(3)狀態轉移方程,dp[i][j]=(s[i]==s[j]&&dp[i+1][j-1]) 需要注意我們這裡動態規劃的順序應為從子串的長度遞增的順序,即先判斷子串長度為1的,然後判斷長度為2的,一直到整個長度。
最後返回為迴文子串的最長的子串即可。LeetCode程式碼如下:
class Solution { public: string longestPalindrome(string s) { int len=s.size(); int maxium=0; int l=0; int size=0; bool dp[len+1][len+1]; int j; for(int ll=0;ll<len;ll++){ for(int i=0;i+ll<len;i++){ j=i+ll; if(ll==0){ dp[i][j]=1; } else if(ll==1){ dp[i][j]=(s[i]==s[j]); } else{ dp[i][j]=(s[i]==s[j]&&dp[i+1][j-1]); }if(dp[i][j]&&maxium<j-i+1){ maxium=max(maxium,j-i+1); l=i; size=ll+1; } } } return s.substr(l,size); } };