假设我们有一串二进制值,其中某些部分可能对应于特定字母,例如:
A = 0
B = 10
C = 001
D = 010
E = 001
例如,如果我们假设字符串" 001010",我们可以有6种不同的可能性:
AABB
ADB
CAB
CD
EAB
ED
我必须提取确切的组合数量
我试图通过动态编程的观点来概念性地解决问题,但是我在子问题的表述和相应矩阵的组成方面遇到了困难。
我很欣赏正确算法制定的任何迹象
提前谢谢。
答案 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