Problem
Das längste häufig auftretende Teilzeichenfolgenproblem besteht darin, die längste Teilzeichenfolge von zwei oder mehr bekannten Zeichenfolgen zu finden. Der Unterschied zwischen diesem Problem und dem längsten gemeinsamen Teilsequenzproblem besteht darin, dass die Teilfolge nicht stetig sein muss, sondern die Teilzeichenfolge.
Angenommen, es gibt zwei Zeichenfolgen, finden Sie die längste gemeinsame fortlaufende Teilzeichenfolge unter ihnen, geben Sie ihre Länge aus und suchen Sie die längste gemeinsame Teilzeichenfolge.
Eingabe:
abcde
bcd
Ausgabe:
3
bcd
Ideen
Dynamische Planung
Füllen Sie das Formular aus
Code
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])
Schriftliche Prüfungsfragen "perfekte Anordnung" Problem
Anwendungsfall für die Eingabe:
3
1 2 3
3 2 1
6
1 2 3 3 2 1
3 2 1 1 2 3
Code
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('完美排列不存在!')