题目描述
算法思路
用数字来等效理解:
两串每个数都不同的数字,例如“123456”和“3495678”,在允许间隔的条件下,寻找其中相同子排序方式,就是“3456”。
首先将“蛋蓝质”按照大写开头分割成每个部分以蛋蓝质存放在两个列表里面,然后可以按照寻找两个字符串之间最长的公共子序列的做法:
建立一个大小为 n * m 的二维数组dp,其中dp[ i ] [ j ]代表当第一个序列取到第i个元素,第二个序列取到第j个序列的时候,可以取到的最长公共子序列。
这是我找的一篇推文:
https://blog.csdn.net/weixin_44084434/article/details/90266466
这篇文章讲查找最长子序列的原理讲的很好
算法源码
我这边呢是一个烂尾楼,我实在找不到到底bug出在哪里,所以下面附上代码,求一个有缘人帮忙一下,如果我自己看懂了也第一时间改正。
import string
# 用以将字符串按照大写开头分割
def optimize(n):
pos = []
sequence = []
for i in range(len(n)):
if(ord(n[i]) >= 65 and ord(n[i]) <= 90):
pos.append(i)
else:
continue
pos.append(len(n)) # 添加末尾的位置
for j in range(len(pos) - 1):
sequence.append(n[pos[j] : pos[j + 1] : 1])
return(sequence)
# main
str_1 = input()
str_2 = input()
sequence_1 = optimize(str_1)
sequence_2 = optimize(str_2)
# 寻找最长子序列
n = len(sequence_1)
m = len(sequence_2)
dp = [[0 for _ in range(m)] for _ in range(n)]
for i in range(1, n):
for j in range(1, m):
if(sequence_1[i] == sequence_2[j]):
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
print(dp[n - 1][m - 1])