多字符替换密码算法



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

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

编辑:我不需要这个密码是可破译的,一种将所有单个字母映射到字母"w",但将字符串"had"映射到字符串"jon"的算法也应该是可以的(然后字符串"Mary有一只小羊羔。"将变为"Wwww-jon-wwwww-www-www.")。

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

一种可能的方法是使用确定性自动机。最接近您的问题和常用的例子是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对于任何其他字符都是可变的。

最新更新