1. 程式人生 > >python實現:求兩個字串的最長公共子串

python實現:求兩個字串的最長公共子串

假設s1 = 'abcdef'  ,s2 = 'mcdea',建立一個(len(s1)+1) x (len(s2)+1)的陣列,如下如所示的一個二維陣列,程式碼的操作流程是:

# -*- coding: utf-8 -*-
"""
Created on Thu Oct  4 16:25:35 2018

@author: DELL
"""
'''
求兩個字串的最長公共子串
思想:建立一個二維陣列,儲存連續位相同與否的狀態
'''
 
def getNumofCommonSubstr(str1, str2):
 
    lstr1 = len(str1)
    lstr2 = len(str2)
    record = [[0 for i in range(lstr2+1)] for j in range(lstr1+1)]  # 多一位
    maxNum = 0          # 最長匹配長度
    p = 0               # 匹配的起始位
 
    for i in range(lstr1):
        for j in range(lstr2):
            if str1[i] == str2[j]:
                # 相同則累加
                record[i+1][j+1] = record[i][j] + 1
                if record[i+1][j+1] > maxNum:
                    # 獲取最大匹配長度
                    maxNum = record[i+1][j+1]
                    # 記錄最大匹配長度的終止位置
                    p = i + 1
                    #print(record)
    return str1[p-maxNum:p], maxNum
 
 
if __name__ == '__main__':
    str1 = 'abcdef'
    str2 = 'mcdea'
 
    res = getNumofCommonSubstr(str1, str2)
    print (res)

二維陣列的變化過程如下:

[[0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0, 1],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 1],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0],
 [0, 0, 0, 2, 0, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0, 1],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0],
 [0, 0, 0, 2, 0, 0],
 [0, 0, 0, 0, 3, 0],
 [0, 0, 0, 0, 0, 0]]

執行結果: