多字符替换密码算法

时间:2015-06-20 11:34:51

标签: algorithm encryption substring substitution string-substitution

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

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

编辑:我不需要这个密码可以解密,这个算法将所有单个字母映射到字母'w'但是将字符串'have'映射到字符串'jon'也应该没问题(那么字符串“玛丽有一只小羊羔。”将成为“Wwww jon w wwwwww wwww。”)。

我希望算法完全通用。

1 个答案:

答案 0 :(得分:0)

一种可能的方法是使用确定性自动机。最接近您的问题和常用示例是Aho–Corasick string matching algorithm。区别在于,您希望在某些过渡时发出密码,而不是匹配。通常在每次转换时,您将发出或不发出密码。 在你的例子中

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对于任何其他角色都是可变的。