Python 如何合并两个列表以找到最小重复因子?

Python 如何合并两个列表以找到最小重复因子?,python,algorithm,dynamic-programming,Python,Algorithm,Dynamic Programming,例如,我有两个列表 A = ["spin", "dab", "dab", "moonwalk", "clap", "moonwalk"] B = ["dab", "dab", "spin", "clap", "clap", "moonwalk"] 合并两个列表后,我可以得到这样的列表 remix=["dab", "spin", "dab", "spin", "dab", "clap", "dab", "moonwalk", "clap", "moonwalk", "clap", "moonwa

例如,我有两个列表

A = ["spin", "dab", "dab", "moonwalk", "clap", "moonwalk"]
B = ["dab", "dab", "spin", "clap", "clap", "moonwalk"]
合并两个列表后,我可以得到这样的列表

remix=["dab", "spin", "dab", "spin", "dab", "clap", "dab", "moonwalk", "clap", "moonwalk", "clap", "moonwalk"]
我的问题是,如何合并两个列表,使相邻元素的重复最少(A和B中的所有元素都必须出现在混音列表中)。 重复是这样的

remix=["spin", "dab", "spin", "dab", "dab", "clap", "dab", "moonwalk", "clap", "moonwalk", "clap", "moonwalk"]
此处相邻的重复是2*dab

另一个例子是

remix=["spin", "dab", "spin", "dab", "dab", "clap", "clap","dab", "moonwalk", "moonwalk", "clap", "moonwalk"]
相邻的重复是2*dab+2*clap

下面是这个问题的输入

A = ["spin", "dab", "dab", "moonwalk", "clap", "moonwalk"]
B = ["dab", "dab", "spin", "clap", "clap", "moonwalk"]
factor={"spin":1,"dab":2,"moonwalk":3,"clap":4}
输出列表:

["dab", "spin", "dab", "spin", "dab", "clap", "dab", "moonwalk", "clap", "moonwalk", "clap", "moonwalk"]
原因是没有重复,因此任何元素的相邻重复为0。 同样,目标是找到具有最小相邻重复的列表,当然,如果我们可以找到一个完全没有重复的列表,则因子可以是0


我在考虑动态规划,但我不知道如何使它工作。非常感谢您的帮助。

我对您的预期结果不太确定。你是说像这样的事吗

import random
A = ["spin", "dab", "dab", "moonwalk", "clap", "moonwalk"]
B = ["dab", "dab", "spin", "clap", "clap", "moonwalk"]

AB = A + B
elem = AB
while elem != []:
    random.shuffle(AB)
    elem = []
    for i in range(len(AB)-1):
        if AB[i] == AB[i+1]:
            elem.append([AB[i],AB[i+1]])
    print (AB)
    print (elem)
    print ("Repetition factor: ")
    for e in elem:
        print(str(len(e)) + "*" + e[0])
    print ("\n")
输出:

['spin', 'moonwalk', 'dab', 'dab', 'spin', 'dab', 'moonwalk', 'moonwalk', 'clap', 'clap', 'dab', 'clap']
[['dab', 'dab'], ['moonwalk', 'moonwalk'], ['clap', 'clap']]
Repetition factor: 
2*dab
2*moonwalk
2*clap

['spin', 'dab', 'clap', 'dab', 'moonwalk', 'dab', 'dab', 'clap', 'moonwalk', 'clap', 'moonwalk', 'spin']
[['dab', 'dab']]
Repetition factor: 
2*dab

['moonwalk', 'dab', 'clap', 'moonwalk', 'clap', 'dab', 'spin', 'dab', 'moonwalk', 'clap', 'dab', 'spin']
[]
Repetition factor: 

使用
A+B
组合列表
A
B
,以便合并列表以最小化相邻重复?是这样吗
dab,dab,clap
是一种重复,但是
spin,dab,spin
不是吗?目标是找到最小的重复因子。如果没有重复,那么这是最好的解决方案,否则以最小的重复输出列表factor@Mark完全正确。请编辑您的尝试,将其编码到您的问题中。来吧,你一定试过了。谢谢你的回答,但是你的回答似乎无法计算输出列表的因子。例如[“旋转”、“dab”、“dab”、“月球漫步”、“拍手”、“月球漫步”、“dab”、“dab”、“旋转”、“拍手”、“拍手”、“月球漫步”],系数应为2*dab+2*dad,但我不确定这是否是所有可能输出列表的最小系数。看看这是否有助于为什么投票?如果还有什么需要改进的地方,请建议我,是的,这可能是解决问题的一种方法。但是你的算法是,随机找到所有可能的列表,然后计算最小值,如果输入是Hugheyes,则不能产生最佳解决方案,并且可能会花费大量时间,你是对的。缺点是,如果您有大量数据,则需要花费大量时间。