動態規劃——求兩個字串子串的個數和最長子串的長度
阿新 • • 發佈:2019-01-10
美圖測開的筆試題:
求兩個字串的子串個數和最大子串長度。
(需要注意一下子串和子序列概念並不相同)
字串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:
子串個數:
這個問題卡了一會兒,考慮到長度為1的子串,子串個數為1;長度為2的子串,子串個數為2+1=3,;長度為3的子串,個數為3+2+1=6.
參看上面的矩陣,會發現子串個數剛好為不為0的數字之和。
python實現:
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 |
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'))