91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用python怎么實現一個最長回文串算法

發布時間:2021-04-30 16:57:57 來源:億速云 閱讀:152 作者:Leah 欄目:開發技術

使用python怎么實現一個最長回文串算法?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

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右邊存在未遍歷的字符,因此在此基礎上,繼續向兩邊擴展,直到找到最長的回文子串。

若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 
  
 #優化版:枚舉子串中心 
 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)#這里為了方便后續計算使用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      #去除特殊字符

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孝义市| 保定市| 木兰县| 天等县| 砀山县| 合肥市| 吉林省| 涡阳县| 特克斯县| 钦州市| 岫岩| 枞阳县| 新密市| 广平县| 吴江市| 双桥区| 盐源县| 青海省| 图木舒克市| 秀山| 千阳县| 麻栗坡县| 巍山| 库尔勒市| 阳曲县| 积石山| 怀柔区| 祁连县| 耒阳市| 泊头市| 东乡族自治县| 清徐县| 哈密市| 应城市| 襄汾县| 麻栗坡县| 松江区| 尼玛县| 榆社县| 惠东县| 文化|