最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)求最長(zhǎng)回文子串長(zhǎng)度

 更新時(shí)間:2018年01月22日 08:46:15   作者:熔遁丶螺旋手里劍  
最長(zhǎng)回文子串問(wèn)題:給定一個(gè)字符串,求它的最長(zhǎng)回文子串長(zhǎng)度。如果一個(gè)字符串正著讀和反著讀是一樣的,那它就是回文串。今天我們就來(lái)探討下這個(gè)問(wèn)題

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

最容易想到的辦法是枚舉出所有的子串,然后一一判斷是否為回文串,返回最長(zhǎng)的回文子串長(zhǎng)度。不用我說(shuō),枚舉實(shí)現(xiàn)的耗時(shí)是我們無(wú)法忍受的。那么有沒(méi)有高效查找回文子串的方法呢?答案當(dāng)然是肯定的,那就是中心擴(kuò)展法,選擇一個(gè)元素作為中心,然后向外發(fā)散的尋找以該元素為圓心的最大回文子串。但是又出現(xiàn)了新的問(wèn)題,回文子串的長(zhǎng)度即可能是基數(shù),也可能好是偶數(shù),對(duì)于長(zhǎng)度為偶數(shù)的回文子串來(lái)說(shuō)是不存在中心元素的。那是否有一種辦法能將奇偶長(zhǎng)度的子串歸為一類,統(tǒng)一使用中心擴(kuò)展法呢?它就是manacher算法,在原字符串中插入特殊字符,例如插入#后原字符串變成'#3#5#5#3#4#3#2#1#'?,F(xiàn)在我們對(duì)新字符串使用中心擴(kuò)展發(fā)即可,中心擴(kuò)展法得到的半徑就是子串的長(zhǎng)度。

現(xiàn)在實(shí)現(xiàn)思路已經(jīng)明確了,先轉(zhuǎn)化字符串'35534321'  ---->  '#3#5#5#3#4#3#2#1#',然后求出以每個(gè)元素為中心的最長(zhǎng)回文子串的長(zhǎng)度。以下給出python實(shí)現(xiàn):

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

def max_substr(string):
  s_list = [s for s in string]
  string = '#' + '#'.join(s_list) + '#'
  max_length = 0
  length = len(string)
  for index in range(0, length):
    r_length = get_length(string, index)
    if max_length < r_length:
      max_length = r_length
  return max_length

def get_length(string, index):
  # 循環(huán)求出index為中心的最長(zhǎng)回文字串
  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
  return length

if __name__ == "__main__":
  result = max_substr("35534321")
  print result

功能已經(jīng)實(shí)現(xiàn)了,經(jīng)過(guò)測(cè)試也沒(méi)有bug,但是我們靜下心來(lái)想一想,目前的解法是否還有優(yōu)化空間呢?根據(jù)目前的解法,我們求出了‘35534321‘中每個(gè)元素中心的最大回文子串。當(dāng)遍歷到'4'時(shí),我們已經(jīng)知道目前最長(zhǎng)的回文子串的長(zhǎng)度max_length是4,這是我們求出了以4為中心的最長(zhǎng)回文子串長(zhǎng)度是3,它比max_length要小,所以我們不更新max_length。換句話說(shuō),我們計(jì)算以4為中心的最長(zhǎng)回文字串長(zhǎng)度是做了無(wú)用功。這就是我們要優(yōu)化的地方,既然某個(gè)元素的最長(zhǎng)的回文子串長(zhǎng)度并沒(méi)有超過(guò)max_length,我們就沒(méi)有必要計(jì)算它的最長(zhǎng)回文子串,在遍歷一個(gè)新的元素時(shí),我們要優(yōu)先判斷以它為中心的回文子串的長(zhǎng)度是否能超越max_length,如果不能超過(guò),就繼續(xù)遍歷下一個(gè)元素。以下是優(yōu)化后的實(shí)現(xiàn):

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

def max_substr(string):
  s_list = [s for s in string]
  string = '#' + '#'.join(s_list) + '#'
  max_length = 0
  length = len(string)
  for index in range(0, length):
    r_length = get_length2(string, index, max_length)
    if max_length < r_length:
      max_length = r_length
  return max_length

def get_length2(string, index, max_length):
  # 基于已知的最長(zhǎng)字串求最長(zhǎng)字串
  # 1.中心+最大半徑超出字符串范圍, return
  r_ = len(string)
  if index + max_length > r_:
    return max_length

  # 2.無(wú)法超越最大半徑, return
  l_string = string[index - max_length + 1 : index + 1]
  r_string = string[index : index + max_length]
  if l_string != r_string[::-1]:
    return max_length

  # 3.計(jì)算新的最大半徑
  result = max_length
  for i in range(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個(gè)‘1'為例,優(yōu)化前的算法執(zhí)行時(shí)間為0.239018201828,優(yōu)化后為0.0180191993713,速度提升了10倍左右

/usr/bin/python /Users/hakuippei/PycharmProjects/untitled/the_method_of_programming.py
0.239018201828
0.0180191993713

再給大家分享一個(gè)實(shí)例:

#!usr/bin/env python
#encoding:utf-8

'''
__Author__:沂水寒城
功能:尋找最長(zhǎng)回文子序列
'''

def slice_window(one_str,w=1):
  '''
  滑窗函數(shù)
  '''
  res_list=[]
  for i in range(0,len(one_str)-w+1):
    res_list.append(one_str[i:i+w])
  return res_list


def is_huiwen(one_str_list): 
  '''
  輸入一個(gè)字符串列表,判斷是否為回文序列 
  ''' 
  if len(one_str_list)==1: 
    return True  
  else: 
    half=len(one_str_list)/2 
    if len(one_str_list)%2==0: 
      first_list=one_str_list[:half] 
      second_list=one_str_list[half:] 
    else: 
      first_list=one_str_list[:half] 
      second_list=one_str_list[half+1:] 
    if first_list==second_list[::-1]: 
      return True  
    else: 
      return False 


def find_longest_sub_palindrome_str(one_str):
  '''
  主函數(shù),尋找最長(zhǎng)回文子序列
  '''
  all_sub=[]
  for i in range(1,len(one_str)):
    all_sub+=slice_window(one_str,i)
  all_sub.append(one_str)
  new_list=[]
  for one in all_sub:
    if is_huiwen(list(one)):
      new_list.append(one)
  new_list.sort(lambda x,y:cmp(len(x),len(y)),reverse=True)
  print new_list[0]


if __name__ == '__main__':
  one_str_list=['uabcdcbaop','abcba','dmfdkgbbfdlg','mnfkabcbadk']
  for one_str in one_str_list:
    find_longest_sub_palindrome_str(one_str)

結(jié)果如下:

abcdcba 
abcba 
bb 
abcba 
[Finished in 0.3s] 

相關(guān)文章

  • 詳解Python修復(fù)遙感影像條帶的兩種方式

    詳解Python修復(fù)遙感影像條帶的兩種方式

    這篇文章主要介紹了詳解Python修復(fù)遙感影像條帶的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 解決django接口無(wú)法通過(guò)ip進(jìn)行訪問(wèn)的問(wèn)題

    解決django接口無(wú)法通過(guò)ip進(jìn)行訪問(wèn)的問(wèn)題

    這篇文章主要介紹了解決django接口無(wú)法通過(guò)ip進(jìn)行訪問(wèn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • OpenCV實(shí)現(xiàn)直線檢測(cè)

    OpenCV實(shí)現(xiàn)直線檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)直線檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Python實(shí)現(xiàn)檢測(cè)照片中的人臉數(shù)

    Python實(shí)現(xiàn)檢測(cè)照片中的人臉數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言實(shí)現(xiàn)檢測(cè)照片中共有多少?gòu)埲四?,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-08-08
  • Python遞歸調(diào)用實(shí)現(xiàn)數(shù)字累加的代碼

    Python遞歸調(diào)用實(shí)現(xiàn)數(shù)字累加的代碼

    今天小編就為大家分享一篇Python遞歸調(diào)用實(shí)現(xiàn)數(shù)字累加的代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • 詳解Python中的四種隊(duì)列

    詳解Python中的四種隊(duì)列

    隊(duì)列是一種只允許在一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表。這篇文章主要介紹了Python中的四種隊(duì)列,需要的朋友可以參考下
    2018-05-05
  • Jupyter notebook遠(yuǎn)程訪問(wèn)服務(wù)器的方法

    Jupyter notebook遠(yuǎn)程訪問(wèn)服務(wù)器的方法

    今天小編就為大家分享一篇Jupyter notebook遠(yuǎn)程訪問(wèn)服務(wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python讀取視頻的兩種方法(imageio和cv2)

    Python讀取視頻的兩種方法(imageio和cv2)

    這篇文章主要為大家詳細(xì)介紹了Python讀取視頻的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python在windows下實(shí)現(xiàn)ping操作并接收返回信息的方法

    python在windows下實(shí)現(xiàn)ping操作并接收返回信息的方法

    這篇文章主要介紹了python在windows下實(shí)現(xiàn)ping操作并接收返回信息的方法,實(shí)例分析了Python實(shí)現(xiàn)ping操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • python命令 -u參數(shù)用法解析

    python命令 -u參數(shù)用法解析

    這篇文章主要介紹了python命令 -u參數(shù)用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論

锦州市| 丁青县| 安多县| 张家川| 万载县| 东丽区| 文昌市| 钟祥市| 勃利县| 宁夏| 镇赉县| 北辰区| 慈利县| 江陵县| 晋江市| 禄劝| 中牟县| 塔河县| 邵东县| 顺义区| 娄底市| 大港区| 深圳市| 丁青县| 延长县| 依兰县| 饶河县| 固始县| 博湖县| 桦南县| 嘉善县| 佳木斯市| 普宁市| 云和县| 涿鹿县| 宣武区| 昆山市| 方山县| 普定县| 诸城市| 东台市|