【发布时间】:2016-02-17 16:59:36
【问题描述】:
假设我有一个原始字符串和一个编码字符串,如下所示:
“abcd” -> “0010111111001010”,那么一种可能的解决方案是“a”匹配“0010”,“b”匹配“1111”,“c”匹配“1100”,“d”匹配与“1010”。
如何编写一个程序,给定这两个字符串,并找出可能的编码规则?
我的第一个划痕是这样的:
fun partition(orgl, encode) =
let
val part = size(orgl)
fun porpt(str, i, len) =
if i = len - 1 then
[substring(str, len * (len - 1), size(str) - (len - 1) * len)]
else
substring(str, len * i, len)::porpt(str, i + 1, len)
in
porpt(encode, 0, part)
end;
但显然它不能检查两个子字符串是否匹配相同的字符,除了按比例划分字符串之外还有很多其他的可能性。
对于这个问题应该有什么合适的算法?
附:只允许使用前缀代码。
我所学到的还没有真正进入严肃的算法,但我做了一些关于回溯的搜索并编写了我的第二版代码:
fun partition(orgl, encode) =
let
val part = size(orgl)
fun backtrack(str, s, len, count, code) =
let
val current =
if count = 1 then
code@[substring(str, s, size(str) - s)]
else
code@[substring(str, s, len)]
in
if len > size(str) - s then []
else
if proper_prefix(0, orgl, code) then
if count = 1 then current
else
backtrack(str, s + len, len, count - 1, current)
else
backtrack(str, s, len + 1, count, code)
end
in
backtrack(encode, 0, 1, part, [])
end;
proper_prefix 函数将检查前缀代码和唯一映射。但是,此功能无法正常运行。
例如,当我输入:
partition("abcd", "001111110101101");
返回结果是:
uncaught exception Subscript
仅供参考,proper_prefix 的主体如下所示:
fun proper_prefix(i, orgl, nil) = true
| proper_prefix(i, orgl, x::xs) =
let
fun check(j, str, nil) = true
| check(j, str, x::xs) =
if String.isPrefix str x then
if str = x andalso substring(orgl, i, 1) = substring(orgl, i + j + 1, 1) then
check(j + 1, str, xs)
else
false
else
check(j + 1, str, xs)
in
if check(0, x, xs) then proper_prefix(i + 1, orgl, xs)
else false
end;
【问题讨论】:
-
你认为这是substitution cipher吗?您是否假设所有位串都具有相同的长度?您是否假设所有字符都映射到唯一的位串?这些假设极大地影响了问题,从而影响了任何确定翻译的算法。
-
是的。这是一个替换密码,它的长度可能不相等——这就是为什么我说我的第一次划痕很糟糕,因为它假设字符的长度相等。是的,映射应该是单射的。
标签: algorithm character-encoding sml