使用python怎么實現一個最長回文串算法?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
為西峰等地區(qū)用戶提供了全套網頁設計制作服務,及西峰網站建設行業(yè)解決方案。主營業(yè)務為網站制作、成都網站設計、西峰網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!python有哪些常用庫python常用的庫:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。
1 . i 關于 j 對稱的字符i'的影響范圍完全包含在j的影響范圍內,則由于回文性,i 的影響范圍大于等于i'的影響范圍,即f[i]>=f[i']
2. i 關于 j 對稱的字符i'的影響范圍不完全包含在j的影響范圍內,此時i的右側影響范圍大于等于[j-f[j]/2,i'],即i+f[i]/2>=i'-j+f[j]/2
由于對稱性,可得i+i" = 2*j。因此第一種情況下,f[i]>=f[2*j-i];第二種情況下,f[i]>=f[j]+2*j-2*i。
綜上1,2,可得f[i]>=min(f[2*j-i],f[j]+2*j-2*i)。由于i右邊存在未遍歷的字符,因此在此基礎上,繼續(xù)向兩邊擴展,直到找到最長的回文子串。
若i依然在j+f[j]/2后面,則表示i沒有被前面的字符的影響,只能逐一的向兩邊擴展。
這個算法由于只需遍歷一遍字符串,擴展的次數也是有限的,所以時間復雜度可以達到O(N)。
下面是Pthon3的程序,為了檢測算法的效率,依然提供最初的暴力枚舉算法作為最壞算法的參照。
python代碼:
#求最長回文串類 class LPS: #初始化,需要提供一個字符串 def __init__(self,string): self.string = string self.lens = len(self.string) #暴力枚舉:作為算法效率參照 def brute_force(self): maxcount = 0 for j in range(self.lens): for k in range(j,self.lens): count = 0 l,m = j,k while m>=l: if self.string[l]==self.string[m]: l,m = l+1,m-1 else: break if m<l: count = k-j+1 if count>maxcount : maxcount = count return maxcount #優(yōu)化版:枚舉子串中心 def brute_force_opti(self): maxcount = 0 if self.lens == 1: #只有一個字符直接返回1 return 1 for j in range(self.lens-1): #枚舉中心 count,u = 1,j #對于奇數子串,直接擴展 for k in range(1,j+1): #兩邊擴展 l,m = u+k,j-k if (m>=0)&(l<self.lens): if(self.string[l]==self.string[m]): count += 2 else: break if count>maxcount : #更新回文子串最長長度 maxcount = count if self.string[j]==self.string[j+1]: #處理偶數子串,將兩個相鄰相同元素作為整體 u,count= j+1,2 for k in range(1,j+1): #兩邊擴展 l,m = u+k,j-k if (m>=0)&(l<self.lens): if(self.string[l]==self.string[m]): count += 2 else: break if count>maxcount : #更新回文子串最長長度 maxcount = count return maxcount #manacher算法 def manacher(self): s = '#'+'#'.join(self.string)+'#' #字符串處理,用特殊字符隔離字符串,方便處理偶數子串 lens = len(s) f = [] #輔助列表:f[i]表示i作中心的最長回文子串的長度 maxj = 0 #記錄對i右邊影響大的字符位置j maxl = 0 #記錄j影響范圍的右邊界 maxd = 0 #記錄最長的回文子串長度 for i in range(lens): #遍歷字符串 if maxl>i: count = min(maxl-i,int(f[2*maxj-i]/2)+1)#這里為了方便后續(xù)計算使用count,其表示當前字符到其影響范圍的右邊界的距離 else : count = 1 while i-count>=0 and i+count<lens and s[i-count]==s[i+count]:#兩邊擴展 count +=1 if(i-1+count)>maxl: #更新影響范圍大的字符j及其右邊界 maxl,maxj = i-1+count,i f.append(count*2-1) maxd = max(maxd,f[i]) #更新回文子串最長長度 return int((maxd+1)/2)-1 #去除特殊字符
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
本文標題:使用python怎么實現一個最長回文串算法-創(chuàng)新互聯(lián)
本文URL:http://muchs.cn/article42/coighc.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網站設計、ChatGPT、商城網站、搜索引擎優(yōu)化、網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)