假设我们有一串二进制值的字符串,其中某些部分可能对应于特定的字母,例如:
A = 0
B = 10
C = 001
D = 010
E = 001
例如,如果我们假设字符串为“001010”,我们可以有六个不同的可能性:
AABB
ADB
CAB
CD
EAB
ED
我需要提取出确切的组合数。我正试图从动态规划的角度概念性地解决这个问题,但在子问题的表述和相应矩阵的组合方面遇到了困难。
非常感谢任何正确算法构建的指导。
提前致谢。
假设我们有一串二进制值的字符串,其中某些部分可能对应于特定的字母,例如:
A = 0
B = 10
C = 001
D = 010
E = 001
AABB
ADB
CAB
CD
EAB
ED
我需要提取出确切的组合数。我正试图从动态规划的角度概念性地解决这个问题,但在子问题的表述和相应矩阵的组合方面遇到了困难。
非常感谢任何正确算法构建的指导。
提前致谢。
您可以使用一个简单的递归过程:尝试将每个模式与字符串的开头匹配;如果有匹配,则以剩余的字符串递归重复。当字符串为空时,您已经找到了一个解码。
Patterns= ["0", "10", "001", "010", "001"]
Letters= "ABCDE"
def Decode(In, Out):
global Patterns
if len(In) == 0:
print Out
else:
for i in range(len(Patterns)):
if In[:len(Patterns[i])] == Patterns[i]:
Decode(In[len(Patterns[i]):], Out + Letters[i])
Decode("001010", "")
AABB
ADB
CAB
CD
EAB
ED
f(i) = sum( f(i - j) * count(matches_j) )
,对于所有以索引i结尾的长度为j的匹配项,具体取决于输入,您还可以通过为字典创建自定义trie来加快速度,这样您只需要检查相关匹配项(例如,A后跟B后跟D)。以您的例子为例:f(0) = 1
f(1) = 1 * f(0) = 1
f(2) = 2
f(3) = 1 * f(2) + 1 * f(1) + 1 * f(0) = 4
f(4) = 0
f(5) = 1 * f(4) + 1 * f(3) + 1 * f(2) = 6
j
只是为了方便表示字典按长度分组 - 在您的示例中,这将是[[A],[B],[C,D,E]]
。对于DP数组中的每个i
,您都会遵循我的公式。 j
序列只是您正在尝试匹配的当前字典单词的长度。 - גלעד ברקן0
处,您只能匹配A
(j = 1
);而在索引3
处,您可以匹配A
,B
,D
(j = 1
,然后是2
,然后是3
)。 (我在注意到一些错误后编辑了我的答案中的示例;现在应该已经修复了。) - גלעד ברקןf(i-j)* count(matches_j)
中?在每一步中,您都会重复使用先前计算的子问题;在我的脑海中,我必须对先前的解决方案进行求和。 - John MòfO(n * k)
,其中 k
是字典单词的数量,但 k
也取决于字典单词的长度。人们会假设字典中每个 j
只有一个匹配项,在这种情况下,您只需编写 f(i - j) if match_j matches, else 0
,但您的字典似乎对相同的子字符串具有多个匹配项(例如,C 和 E 匹配相同的代码)。在这种情况下,您必须进行乘法运算,因为您可以将其中任何一个与字符串中较早的可能性相结合。 - גלעד ברקן