1. 程式人生 > >動態規劃——求兩個字串子串的個數和最長子串的長度

動態規劃——求兩個字串子串的個數和最長子串的長度

美圖測開的筆試題: 求兩個字串的子串個數和最大子串長度。 (需要注意一下子串和子序列概念並不相同)
字串1:str1,字串2:str2 用dp[i][j]表示以str1[i]和str[j]結尾的相同子串的長度。 則轉移方程顯然為: 1.str1[i] != str2[j],則dp[i][j] = 0 2.str1[i] == str2[j],則dp[i][j] = dp[i-1][j-1] + 1 邊界:當i==0 或j==0 的時候:如果str1[i] == str2[j],則dp[i][j] = 1,否則為0 舉例:str1 =‘abcde’ str2=‘eabc’ 轉移矩陣eg:
a b c d e
e 0 0 0 0 1
a 1 0 0 0 0
b 0 2 0 0 0
c 0 0 3 0 0
子串個數: 這個問題卡了一會兒,考慮到長度為1的子串,子串個數為1;長度為2的子串,子串個數為2+1=3,;長度為3的子串,個數為3+2+1=6. 參看上面的矩陣,會發現子串個數剛好為不為0的數字之和。 python實現: 1
def maxSubStr (str1,str2):
2
    l1 = len(str1)
3
    l2 = len(str2)
4
    subStrCount = 0
5
    dp = [[0 for i in range(l2)] for j
in range(l1)]
6
    for i in range(l1):
7
        for j in range(l2):
8
            if i == 0 or j == 0:
9
                if str1[i] == str2[j]:
10
                    dp[i][j] = 1
11
                else:
12
                    dp[i][j] = 0
13
    for i in range
(1,l1):
14
        for j in range(1,l2):
15
            if str1[i] == str2[j]:
16
                dp[i][j] = dp[i-1][j-1] + 1
17
            else:
18
                dp[i][j] = 0
19
    print dp
20
    m = 0
21
    for items in dp:
22
        for item in items:
23
            if item != 0:
24
                subStrCount += item
25
            m = max(m,item)
26
    return m,subStrCount
27
28
29
print(maxSubStr('abcde','eabc'))