最大回文子串是被研究得比較多的乙個經典問題。
最近月神想到了乙個變種,對於乙個字串,如果不要求子串連續,那麼乙個字串的最大回文子串的最大長度是多少呢。
每個測試用例輸入一行字串(由數字0-9,字母a-z、a-z構成),字條串長度大於0且不大於1000.
輸出該字串的最長回文子串的長度。(不要求輸出最長回文串,並且子串不要求連續)
輸入:adbca
輸出:3
說明:因為在本題中,不要求回文子串連續,故最長回文子串為aba(或ada、aca)
使用動態規劃的思想,dp[front][rear]
表示字串s中位置front到位置rear的字串中的最長回文子串的長度,那麼存在兩種情況:
最後,dp[0][-1]就是這個字串的最長回文子串的長度。
values =
input()
.strip(
)vl =
len(values)
dp =[[
0for i in
range
(vl)
]for j in
range
(vl)
]for rear in
range(0
, vl)
: dp[rear]
[rear]=1
for front in
range
(rear-1,
-1,-
1):if values[front]
== values[rear]
: dp[front]
[rear]
= dp[front+1]
[rear-1]
+2else
: dp[front]
[rear]
=max
(dp[front]
[rear-1]
, dp[front+1]
[rear]
)print
(dp[0]
[-1]
)
def
longest_palindrome_substring
(s):
return ******(0,
len(s)-1
)def
******
(front, rear)
:if front == rear:
return
1if front > rear:
return
0if s[front]
== s[rear]
:return ******(front+
1, rear-1)
+2else
:return
max(******(front, rear-1)
, ******(front+
1, rear)
)if __name__ ==
'__main__'
: s =
input()
.strip(
)print
(longest_palindrome_substring(s)
)
提示「執行超時」,可採用以空間換時間,使用字典結構。
def
longest_palindrome_substring
(s):
dp =
def******
(front, rear)
:if front == rear:
return
1if front > rear:
return0if
(front, rear)
in dp:
return dp[
(front, rear)
]if s[front]
== s[rear]
: cur = ******(front+
1, rear-1)
+2else
: cur =
max(******(front, rear-1)
, ******(front+
1, rear)
) dp[
(front, rear)
]= cur
return cur
return ******(0,
len(s)-1
)if __name__ ==
'__main__'
: s =
input()
.strip(
)print
(longest_palindrome_substring(s)
)
(最近更新:2023年08月27日) python 回文字串
題目內容 給定乙個字串,判斷它是否是回文字串 即類似於peep,12321這樣的對稱字串 如果是輸出true,不是則輸出false。判斷過程中假定只考慮字母和數字字元,而且忽略字母的大小寫和其它符號 如空格 標點符號等 輸入格式 共一行,為乙個字串。輸出格式 共一行,為true或false。輸入樣例...
python 回文字串 回文數字
所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的。回文數字也是如此。python2 如下 def huiwen s s1 str s if s1 join reversed s1 return true else return false 執行結果 huiwen abccba true...
python驗證回文字串
給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。說明 本題中,我們將空字串定義為有效的回文串。示例 1 輸入 a man,a plan,a canal panama 輸出 true 示例 2 輸入 race a car 輸出 false 首先將字串轉成小寫,之後提取出字...