動態規劃問題 最長回文串 Python實現

2021-09-26 03:55:23 字數 829 閱讀 4528

#基本思路是對任意字串,如果頭和尾相同,

# 那麼它的最長回文子串一定是去頭去尾之後的部分的最長回文子串加上頭和尾。

# 如果頭和尾不同,

# 那麼它的最長回文子串是去頭的部分的最長回文子串和去尾的部分的最長回文子串的較長的那乙個。

#p[i,j] p[i,j]表示第i到第j個字元的回文子串數

#dp[i,i]=1

#dp[i,j]= dp[i+1,j−1]+2 |s[i]=s[j]

#dp[i,j]=max(dp[i+1,j],dp[i,j−1]) |s[i]!=s[j]

def longestpalindrome(s):

n = len(s)

maxl = 0

start = 0

for i in range(n):

if i - maxl >= 1 and s[i - maxl - 1: i + 1] == s[i - maxl - 1: i + 1][::-1]:

start = i - maxl - 1

maxl += 2

continue

if i - maxl >= 0 and s[i - maxl: i + 1] == s[i - maxl: i + 1][::-1]:

start = i - maxl

maxl += 1

return s[start: start + maxl]

if __name__ == '__main__':

s = "abbajlhkh"

res = longestpalindrome(s)

print(res)

最長回文串 動態規劃)

半對 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 思路一 翻轉字串法。1.將整個字串反轉,然後判斷原始的字串是否在反轉的字串 現。2.只是出現還不...

用動態規劃方法去解決最長回文問題(python)

首先把 貼上來鎮樓,然後慢慢講這個思路。從下面得到的思路,動態規劃的問題最主要的就是轉移方程與狀態方程的建立。思考 當字串從i到j處是回文,那麼從i 1 到j 1處也一定是回文,就這樣一直回溯 直到i j 設定為1,換成我自己的狀態方程就是當x y時,target i,j 1,其他的時候為0 然後轉...

動態規劃 最長回文字串

題目 請從乙個已知的字串中尋找最長回文字串 解法1 動態規劃 回文字串的子串也是回文,比如p i,j 表示以i開始以j結束的子串 是回文字串,那麼p i 1,j 1 也是回文字串。這樣最長回文子串就能分解成一系列子問題了。這樣需要額外的空間o n 2 演算法複雜度也是o n 2 狀態方程和轉移方程 ...