最長回文子串


給定一個字符串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])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM