題目:給定乙個字串 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 時間複...