1

我的问题如下。我有一个替换列表,包括对字母表中每个字母的替换,还有对多个字母组的替换。例如,在我的密码中,p 变为 b,l 变为 w,e 变为 i,但 le 变为 by,ple 变为 memi。

所以,虽然我可以想到一些简单/幼稚的方法来实现这个密码,但它不是很有效,我想知道最有效的方法是什么。答案不必使用任何特定语言,通用结构化英语算法就可以了,但如果它必须使用某种语言,我更喜欢 C++ 或 Java 或类似语言。

编辑:我不需要这个密码是可破译的,一种将所有单个字母映射到字母'w'但将字符串'had'映射到字符串'jon'的算法也应该没问题(然后字符串“玛丽有一只小羊羔。”会变成“Wwww jon w wwww wwww。”)。

我希望算法是完全通用的。

4

1 回答 1

0

一种可能的方法是使用确定性自动机。最接近您的问题和常用示例是Aho–Corasick 字符串匹配算法。不同之处在于,您希望在某个转换时发出密码,而不是匹配。通常在每次转换时,您都会发出或不发出密码。在你的例子中

p -> b
l -> w
e -> i
le -> by
ple -> memi

自动机(在 Erlang 中类似伪代码)

start(p) -> p(next());
start(l) -> l(next());
start(e) -> e(next());
...

p(l) -> pl(next);
p(X) -> emit(b), start(X).

l(e) -> emit(by), start(next());
l(X) -> emit(w), start(X).

e(X) -> emit(i), start(X).

pl(e) -> emit(memi), start(next());
pl(X) -> emit(b), l(X).

如果您不熟悉 Erlang,start(),p()是每个状态的函数。带有 的每一行->是一个过渡,并且动作遵循->. emit()是发出密码next()的函数,是返回下一个字符的函数。X是任何其他字符的变量。

于 2015-06-20T14:03:23.337 回答