如何获得所有可能的组合以使用字典制作字符串

时间:2019-06-03 20:56:29

标签: algorithm dynamic-programming

我有一个字典,假设D = {“ A”,“ B”,“ AB”}和字符串S =“ ABAB”。如何计算可能的组合的数字来创建带有字典的字符串?上述情况的解决方案为 4 ,例如:(AB)(AB),(AB)(A)(B),(A)(B)(AB),(A)( B)(A)(B)。

3 个答案:

答案 0 :(得分:3)

让字典D = {w 1 ,w 2 ,...,w n }其中w i 是明确的词。假设S为字符串。

让Count(S,D)是一个返回使用字典D的单词形成S的可能组合数的函数。Count(S,D)的定义如下。

  1. 如果S是空字符串,则返回1。
  2. 设置c = 0。
  3. 对于D中的每个单词w,如果S都不以w开头,则继续下一个单词。否则设置c = c + Count(S-w,D),其中S-w是从头开始删除w的字符串S。
  4. 返回c。

通过将以前的结果存储在字符串计数表中,可以轻松地得出动态编程实现。在第2步中,在遍历所有单词之前,我们检查S是否在映射中,并返回其计数(如果存在)。在第4步中,在返回c之前,我们将S及其计数存储在地图中。

答案 1 :(得分:1)

递归答案是正确的,但效率不高。您需要做的是动态编程。 子问题是每个字符串S [i ... j]的组合数,子问题的解决方案是将每个w等于(S [i ... j]-w)的值求和S [i ... j]的前缀(从开头删除w)。

答案 2 :(得分:0)

在Python中:

def parse_all(sent, so_far, lexicon):
    """
    sent      remaining sentence to parse
    so_far    word divisions on this branch
    lexicon   dictionary
    """

    # Base case: empty string
    if not sent:
        print(so_far)
        return

    # Recursion
    for word in lexicon:
        if sent.startswith(word):
            parse_all(sent[len(word):], so_far + '|' + word, lexicon)


lexicon = ["A", "B", "AB"]
parse_all("ABAB", "", lexicon)

输出:

|A|B|A|B
|A|B|AB
|AB|A|B
|AB|AB