問題
最も長い共通の部分文字列の問題は、2つ以上の既知の文字列の最も長い部分文字列を見つけることです。この問題と最も長い一般的なサブシーケンスの問題の違いは、サブシーケンスが連続している必要はないが、サブストリングは連続している必要があることです。
2つの文字列があると仮定して、その中で最も長い共通の連続部分文字列を見つけ、その長さを出力して、最も長い共通の部分文字列を見つけます。
入力:
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('完美排列不存在!')