Python程式:查詢子序列中最大回文長度
假設我們有兩個字串s和t。我們想按照以下方式建立一個字串:
從s中選擇一些非空子序列sub1。
從t中選擇一些非空子序列sub2。
連線sub1和sub2,形成一個字串。
我們需要找到可以用這種方式形成的最長迴文長度。如果無法形成任何迴文,則返回0。
例如,如果輸入是s = "hillrace",t = "cargame",則輸出為7,因為我們可以從s中取"race",從t中取"car",所以"racecar"是一個長度為7的迴文。
為了解決這個問題,我們將遵循以下步驟:
n := s的長度,m := t的長度
word := s + t
dp := 建立一個大小為(n+m) x (n+m)的二維陣列,並用0填充
對於i從(n + m - 1)到0遞減,執行:
對於j從i到(n + m - 1),執行:
如果i等於j,則
dp[i, j] := 1
否則,如果word[i]等於word[j],則
dp[i, j] := 2 + dp[i + 1, j - 1]
否則,
dp[i, j] = dp[i + 1, j]和dp[i, j - 1]的最大值
ans := 0
對於i從0到n-1,執行:
對於j從m-1到-1遞減,執行:
如果s[i]等於t[j],則
ans = ans和dp[i, n + j]的最大值
返回ans
示例
讓我們看下面的實現來更好地理解
def solve(s, t): n, m = len(s), len(t) word = s + t dp = [[0] * (n + m) for _ in range(n + m)] for i in range(n + m - 1, -1,-1): for j in range(i, n + m): if i == j: dp[i][j] = 1 elif word[i] == word[j]: dp[i][j] = 2 + dp[i + 1][j - 1] else: dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]) ans = 0 for i in range(n): for j in range(m - 1, -1, -1): if s[i] == t[j]: ans = max(ans, dp[i][n + j]) return ans s = "hillrace" t = "cargame" print(solve(s, t))
輸入
[[2,2],[1,2],[3,2]], [[3,1],[3,3],[5,2]]
輸出
7
廣告