最長回文子字串演算法

2021-08-20 04:18:16 字數 3361 閱讀 3837

def

is_palindrome

(s):

if len(s) <= 1:

return

true

else:

return s[0] == s[-1] and is_palindrome(s[1:-1])

(眾所周知,寫遞迴的函式,需要 1 個基本情況,作為終止。還需要 1 個遞迴情況。

關於回文字串的判斷,基本情況是,為 1 個字元或空字元'',即len(s) <= 1的情況。

對於遞迴的情況,可以這樣判斷:先判斷首尾的字元是否相同,即s[0] == s[-1],然後判斷除去首尾字元以外的字元,即is_palindrome(s[1:-1])。)

參考文獻:

1. 10. 練習:回文 - 《電腦科學導論》學習筆記(22) - 課程 22: 如何擁有無窮力量;

2. 10. 練習:回文 - 課程 22: 如何擁有無窮力量 - 《電腦科學導論》 - 優達學城。

(回文字串的非遞迴實現)

def

iter_palindrome

(s):

for i in range(0, len(s) / 2):

if s[i] != s[-(i+1)]:

return

false

return

true

(請注意for迴圈裡面的if語句的判斷,s[i] != s[-(i+1)]比較的是從外往內遍歷、首尾字元是否相等,如果不相等則立即返回false。如果遍歷到了中間,仍然沒有返回false,這時會退出迴圈,即整個字串就是回文字串。

這裡,也隱含了對於空字串和單個字元的判斷,如果是這兩種情況,不會進入迴圈,會直接返回true。)

參考文獻:

1. 11. 遞迴 vs 迭代 - 《電腦科學導論》學習筆記(22) - 課程 22: 如何擁有無窮力量;

2. 11. 遞迴 vs 迭代 - 課程 22: 如何擁有無窮力量 - 《電腦科學導論》 - 優達學城。

我的**:

def

h2(text):

text = text.lower()

for i in range(len(text)):

for j in range(i+1, len(text)-i-1):

if text[i:j] != text[i:j:-1]:

continue

else:

return (i, j)

print h2('racecar')

print h2('racecar')

print h2('racecarr')

print h2('race carr')

print h2('something rac e car going')

print h2('***xx')

print h2('mad am i ma dam.')

我的**,基於這樣的想法:檢測1個長字串中,從左到右的每1個子字串,是否為回文字串。例如,對於』racecar』,檢測r、ra、rac、race……,第2輪檢測a、ac、ace、acec等等,直至檢測完所有可能的子字串。

但是我的**,測試不通過。

peter的原始**經我簡單調整後:

def

longest_subpalindrome_slice

(text):

"return (i,j) such that text[i:j] is the longest palindrome in text."

if text == '':

return (0,0)

deflength

(slice):

a,b = slice

return b-a

candidates = [grow(text, start, end)

for start in range(len(text))

for end in (start, start+1)]

return max(candidates, key=length)

defgrow

(text, start, end):

"start with a 0- or 1- length palindrome; try to grow a bigger one."

while (start > 0

and end < len(text)

and text[start-1].upper() == text[end].upper()):

start -= 1

end += 1

return (start, end)

peter的原始**:

def

longest_subpalindrome_slice

(text):

"return (i,j) such that text[i:j] is the longest palindrome in text."

if text == '': return (0,0)

deflength

(slice): a,b = slice; return b-a

candidates = [grow(text, start, end)

for start in range(len(text))

for end in (start, start+1)]

return max(candidates, key=length)

defgrow

(text, start, end):

"start with a 0- or 1- length palindrome; try to grow a bigger one."

while (start > 0

and end < len(text)

and text[start-1].upper() == text[end].upper()):

start -= 1; end += 1

return (start, end)

deftest

(): l = longest_subpalindrome_slice

assert l('racecar') == l('racecar') == l('racecarx') == (0, 7)

參考文獻:

1.

字串 最長回文子串

最長回文子串 回文子串 即正著看和倒著看相同的子串,如 abcba yyxyy。由於此類題目為面試筆試常考題目,所以現在就來整理一下啦。1 暴力求解法 最直接的想法就是暴力求解,但是我們可以看到下面的 時間複雜度是o n 3 string findlongeststring string str 暴...

字串 最長回文子串

介紹一下幾個概念 就是從左往右和從右往左讀是一樣的。就如標語 我為人人,人人為我 子串,顧名思義,就是在原字串中的子集,就叫子串。串就是不能分割的,就是連在一起,這個要區別與子串行,子串行就是一段 一段的。列舉各個起點和終點,然後進行判斷該子串是否為回文,最後就是更新最長的回文串。列舉起點和終點 o...

字串 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 思路 用manacher class solution int max 1 int res 0 儲存最...