问题
最长公共子串问题是寻找两个或多个已知字符串最长的子串。此问题与最长公共子序列问题的区别在于子序列不必是连续的,而子串却必须是。
假设有两个字符串,找出其中最长的公共连续子串,输出其长度,并求出该最长公共子串。
输入:
abcde
bcd
输出:
3
bcd
思路
动态规划
填表格
代码
def maxLengthStr(a,b):
n = len(a)
m = len(b)
res = [[0 for _ in range(m)] for _ in range(n)]
for j in range(m):
if a[0] == b[j]:
res[0][j] = 1
for i in range(n):
if b[0] == a[i]:
res[i][0] = 1
max_len = 0
index = 0
for i in range(1,n):
for j in range(1,m):
if a[i-1] == b[j-1] and a[i] == b[j]:
res[i][j] = res[i-1][j-1]+1
if res[i][j] > max_len:
max_len = res[i][j]
index = j
print(res)
return max_len,index
if __name__ == '__main__':
a = [1,2,3]
b = [1,2,3,3,2,1]
max_len,end = maxLengthStr(a,b)
start = end-max_len+1
print('最长公共子串的长度为:',max_len)
print('最长公共子串的起始索引',start)
print('最长公共子串的末位索引', end)
print('最长公共子串为',b[start:end+1])
笔试题“完美排列”问题
输入用例:
3
1 2 3
3 2 1
6
1 2 3 3 2 1
3 2 1 1 2 3
代码
def maxLengthStr(a,b):
n = len(a)
m = len(b)
res = [[0 for _ in range(m)] for _ in range(n)]
for j in range(m):
if a[0] == b[j]:
res[0][j] = 1
for i in range(n):
if b[0] == a[i]:
res[i][0] = 1
max_len = 0
index = 0
for i in range(1,n):
for j in range(1,m):
if a[i-1] == b[j-1] and a[i] == b[j]:
res[i][j] = res[i-1][j-1]+1
if res[i][j] > max_len:
max_len = res[i][j]
index = j
print(res)
return max_len,index
def ver(a_value, b_value, start, end):
print(a_value[:])
print(b_value[start:end+1])
if a_value[:] == b_value[start:end+1]:
return True
return False
if __name__ == '__main__':
a = [1,2,3]
a_value = [3,2,1]
b = [1,2,3,3,2,1]
# b_value = [5,4,3,2,1,1]
b_value = [3,2,1,1,2,3]
max_len,end = maxLengthStr(a,b)
start = end-max_len+1
print('最长公共子串的长度为:',max_len)
print('最长公共子串的起始索引',start)
print('最长公共子串的末位索引', end)
print('最长公共子串为',b[start:end+1])
if ver(a_value, b_value, start, end):
print("完美排列存在,索引为:",start)
else:
print('完美排列不存在!')