使用字典选择不重叠的最高子串总和

时间:2018-02-12 21:33:37

标签: string python-3.x algorithm dictionary dynamic-programming

我们有一些字符串例如

s = 'randomcaran'

我们有包含子串和数值的字典:

d = {'ran': 2, 'ndo': 6, 'omca': 4, 'car': 3}   

我们想要选择返回最高和的组合,而不是字母重叠,但字典d中的子串可以在字符串s中以随机顺序多次找到。当然字符串可以是不同的。

# result should be 9
# string s contains five substrings: 
#     ran   ndo   omca   car   ran            # ran is twice
#      2           4            2       == 8
#            6            3             == 9

或此组合

d = {'ran': 4, 'ndo': 6, 'omca': 4, 'car': 3}
# result should be 12
# string s contains five substrings: 
#     ran   ndo   omca   car   ran            # ran is twice
#      4           4            4       == 12
#            6            3             == 9

第一种情况的天真解决方案可能是:

result = s.count('ndo') * 6
result += s.count('car') * 3

我不知道如何解决这个问题。

从来就试图也这种方式使用正则表达式,但可能这是错误的方法,并有一些简单的方法,̶任何建议?̶̶̶̶̶̶̶̶

i̶m̶p̶o̶r̶t̶ ̶r̶e̶ ̶ ̶ ̶ ̶ ̶ ̶
r̶e̶s̶u̶l̶t̶ ̶=̶ ̶0̶ ̶ ̶ ̶ ̶ ̶
f̶o̶r̶ ̶k̶,̶ ̶v̶ ̶i̶n̶ ̶d̶.̶i̶t̶e̶m̶s̶(̶)̶:̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶
    r̶e̶s̶u̶l̶t̶ ̶+̶=̶ ̶v̶ ̶*̶ ̶r̶e̶.̶f̶i̶n̶d̶a̶l̶l̶(̶r̶'̶{̶0̶}̶?̶'̶.̶f̶o̶r̶m̶a̶t̶(̶k̶)̶,̶ ̶s̶)̶.̶c̶o̶u̶n̶t̶(̶k̶)̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶
    #̶ ̶r̶e̶s̶u̶l̶t̶ ̶+̶=̶ ̶v̶ ̶*̶ ̶s̶.̶c̶o̶u̶n̶t̶(̶k̶)̶ ̶ ̶ ̶ ̶ ̶
p̶r̶i̶n̶t̶(̶r̶e̶s̶u̶l̶t̶)̶ ̶ ̶ ̶#̶ ̶r̶e̶t̶u̶r̶n̶ ̶s̶u̶m̶ ̶o̶f̶ ̶a̶l̶l̶ ̶1̶7̶,̶ ̶b̶u̶t̶ ̶i̶t̶ ̶s̶h̶o̶u̶l̶d̶ ̶b̶e̶ ̶9̶

编辑: 也许动态编程就是答案,但在这种情况下我仍然不知道如何正确地使用这种方法。

1 个答案:

答案 0 :(得分:1)

这实际上是一个已知问题的变体,称为加权间隔调度"。基本上有两种方法:

  1. 递归强力,时间复杂度为O(n * 2 ^ n)
  2. 动态编程,时间复杂度为O(n * log(n))
  3. 您可以在此处详细了解问题和解决方案:https://farazdagi.com/2013/weighted-interval-scheduling/ 那里的解决方案甚至都有python实现!