【python】求兩個(gè)字符串的公共字串?

題目:找出兩個(gè)字符串的最長公共字串,例如字符串“abccade”與字符串“dgcadde”的最長公共子串為“cad”。

分析:動(dòng)態(tài)規(guī)劃法。通過把中間的比較結(jié)果記錄下來,從而可以避免字符的重復(fù)比較。:

首先定義二元函數(shù)(i,j):表示分別以s1[i],s2[j]結(jié)尾的公共子串的長度,顯然,f(0, j) = 0 (j >= 0),f(i, 0) = 0(i >= 0),那么對(duì)于f(i +1, j + 1)而言,則有如下兩種取值:
(1) f(i + 1, j +1) = 0,當(dāng)str1[i + 1] != str2[j + 1]時(shí)

(2)f(i + 1, j +1) = f(i, j) + 1,當(dāng)str1[i + 1] == str2[j + 1]時(shí)

根據(jù)這個(gè)公式可以計(jì)算出f(i, j)(0<= i<=len(s1), 0 <= j <= len(s2),所有的值,從而可以找出最長的子串。

def getMaxSubStr(str1, str2):

? ? len1 = len(str1)

? ? len2 = len(str2)

? ? sb = ''

? ? maxs = 0? # 用來記錄最長公共子串的長度

? ? maxI = 0? # 用來記錄最長公共字串最后一個(gè)字符的位置

? ? # 申請(qǐng)新的空間來記錄公共字串長度信息

? ? M = [([None] * (len1 + 1)) for i in range(len2 + 1)]

? ? i = 0

? ? while i < len1 + 1:

? ? ? ? M[i][0] = 0

? ? ? ? i += 1

? ? j = 0

? ? while j < len2 + 1:

? ? ? ? M[0][j] = 0

? ? ? ? j += 1

? ? # 通過利用遞歸公式填寫新建得二維數(shù)組(公共字串得長度信息)

? ? i = 1

? ? while i < len1 + 1:

? ? ? ? j = 1

? ? ? ? while j < len2 + 1:

? ? ? ? ? ? if list(str1)[i - 1] == list(str2)[j - 1]:

? ? ? ? ? ? ? ? M[i][j] = M[i - 1][j - 1] + 1

? ? ? ? ? ? ? ? if M[i][j] > maxs:

? ? ? ? ? ? ? ? ? ? maxs = M[i][j]

? ? ? ? ? ? ? ? ? ? maxI = i

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? M[i][j] = 0

? ? ? ? ? ? j += 1

? ? ? ? i += 1

? ? i = maxI - maxs

? ? while i < maxI:

? ? ? ? sb = sb + list(str1)[i]

? ? ? ? i += 1

? ? return sb

if __name__ == "__main__":

? ? str1 = 'abccade'

? ? str2 = 'dgcadde'

? ? print(getMaxSubStr(str1, str2))

程序運(yùn)行結(jié)果:

cad


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容