动态规划——求两个字符串子串的个数和最长子串的长度

来源:互联网 发布:php 图片缩略图 编辑:程序博客网 时间:2024/05/20 16:12
美图测开的笔试题:
求两个字符串的子串个数和最大子串长度。
(需要注意一下子串和子序列概念并不相同)

字符串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:
 abcdee00001a10000b02000c00300
子串个数:
这个问题卡了一会儿,考虑到长度为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'))

阅读全文
0 0
原创粉丝点击