在信息论中,“前缀代码”是一个字典,其中所有键都不是另一个的前缀。换句话说,这意味着没有一个字符串以其他任何字符串开头。
例如,{"9", "55"}
是前缀代码,但{"5", "9", "55"}
不是。
这样做的最大优点是,可以将编码的文本记下来,并且它们之间没有分隔符,并且仍然可以唯一地解密。这在诸如Huffman编码之类的压缩算法中得到了体现,该算法始终会生成最佳的前缀代码。
您的任务很简单:给定一个字符串列表,确定它是否是有效的前缀代码。
您的输入:
将是任何合理格式的字符串列表。
仅包含可打印的ASCII字符串。
将不包含任何空字符串。
您的输出将是一个true / falsey值:如果是有效的前缀代码,则为True,否则为falsey。
这是一些真实的测试用例:
["Hello", "World"]
["Code", "Golf", "Is", "Cool"]
["1", "2", "3", "4", "5"]
["This", "test", "case", "is", "true"]
["111", "010", "000", "1101", "1010", "1000", "0111", "0010", "1011",
"0110", "11001", "00110", "10011", "11000", "00111", "10010"]
以下是一些错误的测试案例:
["4", "42"]
["1", "2", "3", "34"]
["This", "test", "case", "is", "false", "t"]
["He", "said", "Hello"]
["0", "00", "00001"]
["Duplicate", "Duplicate", "Keys", "Keys"]
这是代码高尔夫球,因此存在标准漏洞,并且以字节为单位的最短答案将获胜。
001
才能被独特地解读?可以是00, 1
或0, 11
。
0, 00, 1, 11
所有键都用作键,则这不是前缀码,因为0是前缀00,而前缀是11。前缀码是所有键都不以另一个键开头的位置。因此,例如,如果您的密钥是0, 10, 11
前缀代码,并且可以唯一解密。001
是不是有效的消息,但0011
还是0010
有独特的辨认。