用Python求最長子串長度快速版

2021-01-20 美國主機愛好者

哈嘍大家好,周二也是令人愉快的一天啊,今天天氣不錯,坐在窗戶旁邊邊曬太陽邊寫文章,再泡杯熱茶,真是舒服美好,廢話不多說,今天說一下Python求最長子串長度,希望對大家有作用,raksmart伺服器。

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

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

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

#!/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

max_length = r_length

return max_length

def get_length2(string, index, max_length):

# 基於已知的最長字串求最長字串

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

r_ = len(string)

if index + max_length > r_:

return max_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]:

return max_length

# 3.計算新的最大半徑

result = max_length

for i in range(max_length, r_):

if index-i >= 0 and 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.py

怎麼樣,是不是很好用呢?今天就到這裡,大家明天見咯。

相關焦點

  • 你真的知道 Python 字符串怎麼用嗎?
    作者 | 豌豆花下貓責編 | 郭芮Python 中字符串是由 Uniocde 編碼的字符組成的不可變序列,它具備與其它序列共有的一些操作,例如判斷元素是否存在、拼接序列、切片操作、求長度、求最值、求元素的索引位置及出現次數等等
  • Python 格式化字符串的最佳姿勢
    Python 處理數據和文本的同學一定經常要和字符串格式化打交道,少不了要打一堆 %。這當然不是因為被虐習慣了,而是我發現相比用 % 進行字符串格式化,有更好用的方法,今天就給大家分享一下。在進入正題之前,還是應該來回顧一下之前我們是怎麼格式化字符串的。
  • 如何用python製作動態二維碼,來哄女朋友開心?
    教你如何用python製作動態二維碼,來哄女朋友開心?2、安裝MyQR庫直接用需要注意的是MyQR依賴於python3,在python2的環境下可能無法正常運行。>4、生成普通二維碼在程序中導入MyQR包下的模板myqr,其中word參數接收一個字符串作為二維碼的內容
  • Python3的字符串類型(瘋狂Python)
    字符串可以用+運算符連接在一起,用*運算符重複。Python中的字符串有兩種索引方式,從左往右以0開始,從右往左以-1開始。Python中的字符串不能改變。4.2.1 repr和字符串Python不允許直接拼接數值和字符串,必須先將數值轉換成字符串。
  • 慢步學習二級python,字符串類型的操作:操作符,函數和方法
    繼續學習二級python考試的大綱內容:4.字符串類型的操作:字符串操作符,處理函數和處理方法學習字符串類型數據的操作是學習python的基礎。「love」字符串重複2次,再由+與前面「我愛你」連接。第3和第4個指令,也是在重複試驗*的作用。後面引入字符串變量a,a被賦值成字符串「God」,後續指令證實,字符串變量和字符串一樣都可以使用相應的操作符。倒數第2條指令,提示語法錯誤,字符串變量和字符串不能通過空格連接。
  • Python輸出數據print,獲取輸入數據input,基礎入門
    python的輸入和輸出一、print輸出printprint把內容輸出到文件print把內容輸出到文件二、input輸入print是輸出,input接收鍵盤的輸入input()函數,是python的內置函數,接收任意數據類型的輸入,將所有輸入的數據,定義為字符串來進行處理,並返回字符串類型。
  • Python常用庫大全
    PyTime – 一個簡單易用的Python模塊,用於通過字符串來操作日期/時間。 pytz – 現代以及歷史版本的世界時區定義。將時區資料庫引入Python。 when.py – 提供用戶友好的函數來幫助用戶進行常用的日期和時間操作。 文本處理用於解析和操作文本的庫。通用 chardet – 字符編碼檢測器,兼容 Python2 和 Python3。
  • 騰訊大佬的 Python 編碼規範
    /usr/bin/env python# -*- coding: utf-8 -*-"""通常這裡是關於本文檔的說明(docstring),須以半角的句號、 問號或驚嘆號結尾!如果 python 源碼文件沒有聲明編碼格式,python 解釋器會默認使用 ASCII 編碼,一旦源碼文件包含非ASCII編碼的字符,python 解釋器就會報錯。以 UTF-8 為例,以下兩種編碼格式聲明都是合乎規則的。我一直 UTF-8 編碼格式,喜歡使用第一種聲明方式。Windows 平臺上,編碼格式聲明必須位於 python 文件的第一行。
  • Python中如何分割、合併字符串
    第七十四節:分割、合併字符串字符串可以通過分割操作,劃分成一個個小個體;也可以用過合併操作,重新組成一個完整的字符串。它的格式是下面這樣的:strlist = string.split(sep,maxsplit)上面的strlist代表了分割後的字符列表;字符串string後用一個英文半角句號「.」連接split函數;小括號「()」
  • Python初學者請注意!別這樣直接運行python命令,否則電腦等於「裸奔」!
    原因當然是Python簡明易用的腳本語法,只需把一段程序放入.py文件中,就能快速運行。而且Python語言很容易上手模塊。比如你編寫了一個模塊my_lib.py,只需在調用這個模塊的程序中加入一行import my_lib即可。
  • 實戰|教你用Python玩轉Redis
    之前辰哥已經給大家教了Python如何去連接Mysql(實戰|教你用Python玩轉Mysql),並進行相應操作(插、查、改、刪)。除了Mysql外,Python最常搭配的資料庫還有Redis。那麼今天辰哥就來給大家講解一下Python如何使用Redis,並進行相關的實戰操作。
  • 如何用 Python 寫一個安卓 APP ?
    22點24分準時推送,第一時間送達  編輯:技術君 | 來源:youerning  上一篇:  正文  前言  用 Python 寫安卓 APP 肯定不是最好的選擇,目前用Java和 kotlin
  • 利用python免殺cs shellcode
    人們用助記符號代替機器指令碼從而形成了彙編語言,後來為了使計算機用戶編程序更容易,發展出了各種高級計算機語言。但是,無論是彙編語言還是其他各種面向過程異或面向對象的高級語言所寫的代碼最終都要被相關的翻譯編譯環境轉換成相應的機器指令碼,計算機才能運行該段代碼,因為計算機只認識機器指令碼。
  • python爬蟲 - 字符串
    python字符串Python中的字符串可以使用單引號、雙引號和三引號(三個單引號或三個雙引號,可以換行的)括起來,使用反斜槓 \ 轉義特殊字符Python3源碼文件默認以UTF-8編碼,所有字符串都是unicode字符串支持字符串拼接、截取等多種運算
  • 用python將你的頭像「卡通化」
    最近看到一個有趣的pyt
  • 如何在Mac上安裝更新的Python 3.6.x
    本文將討論如何通過覆蓋兩種不同的方法在Mac上快速輕鬆地安裝Python 3,從而在Mac上獲得更新的Python 3安裝。一、如何在Mac OS中安裝更新的Python 3也許最簡單的安裝Python 3的方法是使用python.org中的Python包安裝程序。
  • 學習Python正則表達式
    它有助於檢查字符串中的每個字符,看它是否與某個模式匹配:哪些字符在什麼位置出現了多少次。讓我們看看丹正在讀的評論:「I have called the service desk 100 times and nobody replies to me. I need a conversation ASAP!!
  • Python到底是個啥?為什麼這麼多人都要學?
    Python是一種跨平臺的電腦程式設計語言,一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本,具有豐富和強大的庫,Python語言的核心只包含數字、字符串、列表、字典、文件等常見類型和函數,它常被暱稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。
  • 156個Python網絡爬蟲資源,媽媽再也不用擔心你找不到資源
    lxml and cssselect的配置驅動包裝工具清理Bleach – 清理HTML (需求html5lib)sanitize – 將混亂的數據世界恢復清楚文本處理解析及操作文本的庫通用difflib – 差異化計算工具(Python標準庫)Levenshtein – 快速計算編輯距離及字符串相似度
  • 單片機上運行Python-MicroPython(三)
    其多存在於gc模塊和micropython模塊。可將下面的示例代碼粘貼到REPL中運行查看效果。(1)上面使用的函數如下:gc.collect() 強制垃圾回收micropython.mem_info() 列印RAM使用情況匯總gc.mem_free() 返回堆棧剩餘內存空間字節數gc.mem_alloc() 返回當前已分配的內存字節數micropython.mem_info(1) 以表格形式列印出RAM使用情況