給定一個字符串s,找到其中最長的回文子序列。可以假設s的最大長度為1000。
示例 1:
輸入:
"bbbab"
輸出:
4
一個可能的最長回文子序列為 "bbbb"。
示例 2:
輸入:
"cbbd"
輸出:
2
思路: 動態規划。
dp[i][j]表示索引i到j的子串是否是回文 dp[i][j] = true表示是回文,反之則為false dp[i][i]只有一個字符,必是回文 關鍵點在於找到關系:dp[i][j] = dp[i + 1][j - 1] && s.charAt(i) == s.charAt(j); 長的子串dp[i][j]依賴於短的子串dp[i + 1][j - 1],所以由短到長依次計算
就是說:
dp[i][j] = longest palindrome subsequence of s[i to j].
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])
按照這個思路,解法如下:
s = input() n = len(s) dp = [[0 for i in range(n)] for j in range(n)] for i in range(n-1, -1, -1): dp[i][i] = 1
for j in range(i+1, n): 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]) print(dp[0][-1])