日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python求回文_python实现求最长回文子串长度

發布時間:2025/3/19 python 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python求回文_python实现求最长回文子串长度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個字符串,求它最長的回文子串長度,例如輸入字符串'35534321',它的最長回文子串是'3553',所以返回4。

最容易想到的辦法是枚舉出所有的子串,然后一一判斷是否為回文串,返回最長的回文子串長度。不用我說,枚舉實現的耗時是我們無法忍受的。那么有沒有高效查找回文子串的方法呢?答案當然是肯定的,那就是中心擴展法,選擇一個元素作為中心,然后向外發散的尋找以該元素為圓心的最大回文子串。但是又出現了新的問題,回文子串的長度即可能是基數,也可能好是偶數,對于長度為偶數的回文子串來說是不存在中心元素的。那是否有一種辦法能將奇偶長度的子串歸為一類,統一使用中心擴展法呢?它就是manacher算法,在原字符串中插入特殊字符,例如插入#后原字符串變成'#3#5#5#3#4#3#2#1#'。現在我們對新字符串使用中心擴展發即可,中心擴展法得到的半徑就是子串的長度。

現在實現思路已經明確了,先轉化字符串'35534321'? ---->??'#3#5#5#3#4#3#2#1#',然后求出以每個元素為中心的最長回文子串的長度。以下給出python實現:

#!/usr/bin/python#-*- coding: utf-8 -*-

defmax_substr(string):

s_list= [s for s instring]

string= '#' + '#'.join(s_list) + '#'max_length=0

length=len(string)for index inrange(0, length):

r_length=get_length(string, index)if max_length

max_length=r_lengthreturnmax_lengthdefget_length(string, index):#循環求出index為中心的最長回文字串

length =0

r_=len(string)for i in range(1,index+1):if index+i < r_ and string[index-i] == string[index+i]:

length+= 1

else:break

returnlengthif __name__ == "__main__":

result= max_substr("35534321")print result

功能已經實現了,經過測試也沒有bug,但是我們靜下心來想一想,目前的解法是否還有優化空間呢?根據目前的解法,我們求出了‘35534321‘中每個元素中心的最大回文子串。當遍歷到'4'時,我們已經知道目前最長的回文子串的長度max_length是4,這是我們求出了以4為中心的最長回文子串長度是3,它比max_length要小,所以我們不更新max_length。換句話說,我們計算以4為中心的最長回文字串長度是做了無用功。這就是我們要優化的地方,既然某個元素的最長的回文子串長度并沒有超過max_length,我們就沒有必要計算它的最長回文子串,在遍歷一個新的元素時,我們要優先判斷以它為中心的回文子串的長度是否能超越max_length,如果不能超過,就繼續遍歷下一個元素。以下是優化后的實現:

#!/usr/bin/python#-*- coding: utf-8 -*-

defmax_substr(string):

s_list= [s for s instring]

string= '#' + '#'.join(s_list) + '#'max_length=0

length=len(string)for index inrange(0, length):

r_length=get_length2(string, index, max_length)if max_length

max_length=r_lengthreturnmax_lengthdefget_length2(string, index, max_length):#基于已知的最長字串求最長字串

#1.中心+最大半徑超出字符串范圍, return

r_ =len(string)if index + max_length >r_:returnmax_length#2.無法超越最大半徑, return

l_string = string[index - max_length + 1 : index + 1]

r_string= string[index : index +max_length]if l_string != r_string[::-1]:returnmax_length#3.計算新的最大半徑

result =max_lengthfor i inrange(max_length, r_):if index-i >= 0 and index+i < r_ and string[index-i] == string[index+i]:

result+= 1

else:break

return result - 1

if __name__ == "__main__":

result= max_substr("35534321")print result

那么速度到底提升了多少呢,以字符串1000個‘1’為例,優化前的算法執行時間為0.239018201828,優化后為0.0180191993713,速度提升了10倍左右

/usr/bin/python /Users/hakuippei/PycharmProjects/untitled/the_method_of_programming.py0.239018201828

0.0180191993713

總結

以上是生活随笔為你收集整理的python求回文_python实现求最长回文子串长度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。