立志要熟練動態規劃,加油!css
最長迴文子串
給定一個字符串 s
,找到 s
中最長的迴文子串。你能夠假設 s
的最大長度爲 1000。
思路:設dp[l][r]表示s[l……r]是否迴文,枚舉右邊界r,而後從0枚舉l一直到r,dp[r][l] = s[r]==s[l] && (r-1-l-1+1<=1 || dp[l+1][r-1]),意思是當s[r]和s[l]相等時,則須要s[l+1~r-1]也迴文,而若是l+1~r-1這一段長度小於等於1,那麼確定迴文,不然看dp[l+1][r-1]是否爲true便可,由於dp[l+1][r-1]是已經獲得的。
c++:c++
class Solution { public: string longestPalindrome(string s) { int len=s.length(),dp[1005][1005]; if(len<=1) return s; for(int i=0;i<len;i++) { for(int j=0;j<len;j++) dp[i][j]=0; } string ans=s.substr(0,1); int mx=1; for(int i=1;i<len;i++) { for(int j=0;j<i;j++) { if(s[i]==s[j]&&(i-j-2+1<=1||dp[j+1][i-1])) { dp[j][i]=1; if(i-j+1>mx) { ans=s.substr(j,i-j+1); mx=i-j+1; // cout<<ans<<endl; } } } } return ans; } };