求任意兩字符串的最長公共子串長度,并找出所有最長公共子串

一、代碼

def lcstring(string1, string2):
    len1 = len(string1)
    len2 = len(string2)
    # dp[i][j]表示string1和string2中,以string1[i]/string2[j]結尾的最長公共子串長度
    # 當i,j皆大于0時,若string1[i - 1] 與 string2[j - 1] 相等
    # 則 dp[i][j] = dp[i - 1][j - 1] + 1
    # 否則 dp[i][j] = 0
    dp = [[0 for j in range(len2 + 1)] for i in range(len1 + 1)]
    # 用于保存當前階段最長公共子串的長度
    max_len = 0
    # 用于保存長度為當前階段max_len的所有公共子串
    lcstring_set = None
    for i in range(1, len1 + 1):
        for j in range(1, len2 + 1):
            if string1[i - 1] == string2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
                if dp[i][j] > max_len:
                    max_len = dp[i][j]
                    lcstring_set = set()
                    lcstring_set.add(string1[i - max_len:i])
                elif dp[i][j] == max_len:
                    lcstring_set.add(string1[i - max_len:i])
            else:
                dp[i][j] = 0

    return max_len, lcstring_set


max_len, lcstring_set = lcstring('habcdelloworldertyasdfd', 'loopabcdddqasdfdertyzsdfsv')
print(max_len)
print(lcstring_set)

2、運行結果

5
{'asdfd', 'derty'}

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容