我有一个字典,假设D = {“ A”,“ B”,“ AB”}和字符串S =“ ABAB”。如何计算可能的组合的数字来创建带有字典的字符串?上述情况的解决方案为 4 ,例如:(AB)(AB),(AB)(A)(B),(A)(B)(AB),(A)( B)(A)(B)。
答案 0 :(得分:3)
让字典D = {w 1 ,w 2 ,...,w n }其中w i 是明确的词。假设S为字符串。
让Count(S,D)是一个返回使用字典D的单词形成S的可能组合数的函数。Count(S,D)的定义如下。
通过将以前的结果存储在字符串计数表中,可以轻松地得出动态编程实现。在第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