最長公共子串 動態規劃

2021-08-25 02:56:51 字數 2905 閱讀 7501

題目:給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。

示例:

輸入: 「babad」

輸出: 「bab」

注意: 「aba」也是乙個有效答案。

思想:動態規劃

步驟:

第一步:確定子問題。 在這一步重點是分析那些變數是隨著問題規模的變小而變小的, 那些變數與問題的規模無關。

第二步:確定狀態:根據上面找到的子問題來給你分割的子問題限定狀態

第三步:推到出狀態轉移方程:這裡要注意你的狀態轉移方程是不是滿足所有的條件

第四步:確定邊界條件

解題:

我們給出 p(

i,j)

p (i

,j)的定義如下: p(

i,j)

= p(i

,j)=

狀態轉移方程: p(

i,j)

=(p(

i+1,

j−1)

and si

==sj)

(1) p(i

,j)=

(p(i

+1,j

−1)and si

==sj)

(1)邊界條件: p(

i,i)

=tru

e(2)

p (i

,i)=

true

(2)p(i

,i+1

)=(s

i==si

+1)(

3)p (i

,i+1

)=(s

i==si

+1)(

3)1)p(

i,j)

p (i

,j)的定義表示了i i

到j' role="presentation" style="position: relative;">j

j之間的子串是否是回文子串,如果是,則p(

i,j)

p (i

,j)為true,否則p(

i,j)

p (i

,j)為false

2)狀態轉移方程(公式(1))表明了p(

i,j)

p (i

,j)的值由p(i

+1,j

−1) p(i

+1,j

−1)和s

i==sj

s i==

sj決定,即如果i+

1 i+1到j

−1j −1

的子串是回文子串並且字元si

==sj si==

sj則p(i,j

) p(i,

j)也是回文子串.

3)公式(2)表明自身乙個字元也是回文子串;

4)公式(3)表明本身與下乙個字串能否構成回文子串取決於si

和si+

1 si和s

i+1分析:

由公式(1)知,

i i

依賴於i+

1' role="presentation" style="position: relative;">i+1

i+1,

j j

依賴於j−

1' role="presentation" style="position: relative;">j−1

j−1;所以第1個迴圈應該是」後面->前面」,第2個迴圈是」前面->後面」,時間複雜度o(

n2) o(n

2),空間複雜度o(

n2) o(n

2),程式步驟如下:

#給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。

"""思路:動態規劃

"""class

solution:

deflongestpalindrome

(self, s):

""" :type s: str

:rtype: str

"""n=len(s)

if n==0:

return

"" p = [[none

for i in range(n)] for j in range(n)]

start=0

maxlen=1

for i in range(n-1,-1,-1):

for j in range(i,n,1):

if i==j:

p[i][j]=true

elif j-i==1:

p[i][j]=(s[i]==s[j])

else:

p[i][j]=(p[i+1][j-1] and s[i]==s[j])

if p[i][j]==true

and (j-i+1)>maxlen:

start=i

maxlen=j-i+1

print("({},{}),{}".format(i,j,p[i][j]))

return s[start:start+maxlen]

if __name__=='__main__':

so=solution()

a=so.longestpalindrome("efgen")

print(a)

最長公共子串 最長公共子串 動態規劃

有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在1000以內 例如 輸入 abcde bcd 輸出 3 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。3 通過查詢出值為1的最長對角線就能找到最長公...

最長公共子串(動態規劃)

描述 計算兩個字串的最大公共子串 longest common substring 的長度,字元不區分大小寫。輸入 輸入兩個字串 輸出 輸出乙個整數 樣例輸入 asdfas werasdfaswer樣例輸出 6 參考 這裡的最大公共字串要求的字串是連續的。求字串的方法和求子序列方法類似 當s i t...

最長公共子串(動態規劃)

include include using namespace std 最長公共子串問題 動態規劃 dp i j 表示在必須將str1 i 1 和str2 j 1 作為公共子串最後乙個字元的情況下,公共子串最大長度 dp i j 取決於dp i 1 j dp i j 1 dp i 1 j 1 時間複...