完全沒思路啊沒思路。。。。Copy代碼,想書寫一遍矩陣,還被卡住了,完全不知道自己錯在哪里!!
解題思路:動態規划。
設立一個len行len列的dp數組~dp[i][j]表示字符串i~j下標所構成的子串中最長回文子串的長度~最后我們需要返回的是dp[0][len-1]的值~
dp數組這樣更新:首先i指針從尾到頭遍歷,j指針從i指針后面一個元素開始一直遍歷到尾部~一開始dp[i][i]的值都為1,如 果當前i和j所指元素相等,說明能夠加到i~j的回文子串的長度中,所以更新dp[i][j] = dp[i+1][j-1] + 2; 如果當前元素不相 等,那么說明這兩個i、j所指元素對回文串無貢獻,則dp[i][j]就是從dp[i+1][j]和dp[i][j-1]中選取較大的一個值即可。
- class Solution{
- public:
- int longestPalindromeSubseq(string s)
- {
- vector<vector<int>> dp(s.length(),vector<int>(s.length()));
- for(int i=s.length()-1;i>=0;i--)
- {
- dp[i][i]=1;
- for(int j=i+1;j<s.length();j++)
- {
- if(s[i]==s[j])
- dp[i][j]=dp[i+1][j-1]+2;
- else
- dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
- }
- }
- return dp[0][s.length()-1];
- }
- };
回文子序列,就是正序反序順序一樣,該序列在原序列中不需要連續。
。