计算给定数字序列的可能解码

时间:2016-05-16 22:07:31

标签: algorithm dynamic-programming

假设我们有一串二进制值,其中某些部分可能对应于特定字母,例如:

A = 0
B = 10
C = 001
D = 010
E = 001

例如,如果我们假设字符串" 001010",我们可以有6种不同的可能性:

AABB
ADB
CAB
CD
EAB
ED

我必须提取确切的组合数量 我试图通过动态编程的观点来概念性地解决问题,但是我在子问题的表述和相应矩阵的组成方面遇到了困难。
我很欣赏正确算法制定的任何迹象 提前谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用简单的递归过程:尝试将每个模式匹配到字符串的开头;如果匹配,则以字符串的其余部分递归重复。当字符串为空时,您已找到解码。

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

答案 1 :(得分:1)

在解决DP问题时,首先考虑递归解决方案,然后考虑将其转换为DP解决方案通常会有所帮助。

这里一个很好的递归见解是,如果你有一个非空的数字串,任何解码方式都将从一些单个字符开始。因此,您可以通过尝试每个字符来计算解码字符串的方式的数量,看它是否在开头匹配,如果是,则计算解码其余字符串的方式。

这会变成一个不错的DP问题的原因是当你拉出一个单个字符时,你会留下一个较短的数字串,它始终是原始字符串的后缀。因此,假设您为原始字符串的每个后缀创建了一个表,存储了解码该字符串的方式。如果您使用上述洞察力从右到左填充该矩阵,您最终将通过读取与整个字符串对应的条目来获得最终答案。

看看你是否能找到一种方法将其变成一个具体的算法,然后去编码。祝你好运!

答案 2 :(得分:1)

您可以制定一个DP between 1 and 12,根据输入,您也可以通过为字典创建自定义特里加速来加速,这样您就只能检查相关匹配(例如,A后跟B跟随由D)。举个例子:

f(i) = sum( f(i - j) * count(matches_j) ), for all matches of length j ending at index i