"""
两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含了以前两种水果名字的字母,并且这个名字要尽量短。也就是说以前的一种水果名字arr1是新水果名字arr的子序列,另一种水果名字arr2也是新水果名字arr的子序列。设计一个算法求arr。
【输入形式】输入一组水果
【输出形式】输出新水果名称
【样例输入】apple peach
【样例输出】appleach
"""
def ShortestCommonSuperSequence(str1, str2):
m=len(str1)
n=len(str2)
dp=[[0]*(n+1)for _ in range(m+1)] #创建备忘录数组
#找到最短长度
for i in range(m+1):
for j in range(n+1):
#初始化dp,注意!= 0
if i==0:
dp[i][j] = j
elif j==0:
dp[i][j] = i
elif str1[i-1]==str2[j-1]:#注意i,j是长度,最后一个元素下标要-1
dp[i][j] = dp[i-1][j-1]+1
else:
dp[i][j] = 1+min(dp[i-1][j],dp[i][j-1])#不要忘记也要+1,因为是从两个里面选了一个最短的,而不是没选
#据表找到scs字符串
i=m
j=n
scs=[]
while i>0 and j>0:
if str1[i-1]==str2[j-1]:
scs.append(str1[i-1])
i-=1
j-=1
elif dp[i-1][j]>dp[i][j-1]:
scs.append(str2[j-1])
j-=1
else:
scs.append(str1[i-1])
i-=1
#由于上面的循环条件and,可能i,j没有到零,将其未处理完的部分加入SCS
while i>0:
scs.append(str1[i-1])
i-=1
while j>0:
scs.append(str2[j-1])
j-=1
#由于上述SCS是逆序构建的,需要反转
#语法:反转列表:reversed(list)
# 构建成字符串:“拿什么连接(啥也没有/空格/箭头)”。join(列表)
return "".join(reversed(scs))
#调用
inputstr=input().strip()
str=inputstr.split()
a=str[0]
b=str[1]
print(ShortestCommonSuperSequence(a,b))
最短公共超序列SCS——杂交水果起名
最短公共超序列SCS与动态规划
最新推荐文章于 2025-12-13 11:28:09 发布
791

被折叠的 条评论
为什么被折叠?



