python代碼:
class Solution(object): def longestPalindromeSubseq(self, s): """ :type s: str :rtype: int """ dp = [[0 for i in range(len(s))] for i in range(len(s))] for i in range(len(s)): dp[i][i] = 1 for i in range(1,len(s)): for j in range(i-1,-1,-1): if s[i] == s[j]: dp[j][i] = 2+dp[j+1][i-1] else: dp[j][i]=max(dp[j+1][i],dp[j][i-1]) return dp[0][len(s)-1]結果Time limit exceeded,思路:dp[i][j]代表從i到j的子串中,最大的回文子串長度。dp[i][i],只有一個字母,一定是回文且長度為1。從dp[0][1]開始遍歷,dp[2][1],dp[2][0],dp[3][2],dp[3][1],dp[3][0]的順序遍歷,如果si和sj相等,那j到i間最短的回文子串也至少是2,再加上j+1到i-1之間的回文子串,可以拼成一個新的回文子串,因此長度也要相加。如果si和sj不相等,則dp[j][i]等于去掉si或sj后能獲得的最長回文子串的長度。參考http://www.cnblogs.com/93scarlett/p/6385602.html后改為C++代碼,成功。
AC代碼:
class Solution {public: int longestPalindromeSubseq(string s) { int n = s.size(); int dp[n][n]={0}; for(int i = 0; i < n; i++){ dp[i][i] = 1; } for(int j = 1; j < n; j++){//j從1開始 //for(int i = 0; i < j; i++){ for(int i = j - 1; i >= 0; i--){ //if(s[i] == s[j] && i + 1 <= j - 1){ if(s[i] == s[j]){ dp[i][j] = 2 + dp[i + 1][j - 1]; }else{ dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); } } } return dp[0][n - 1]; }};
新聞熱點
疑難解答