我的问题如下。我有一个替换列表,包括字母表中每个字母的一个替换,但也有一些替换多个字母的组。例如,在我的密码p变为b,l变为w,e变为i,但le变为,并且ple变为memi。
所以,虽然我可以想到一些简单/天真的方法来实现这个密码,但它效率不高,我想知道最有效的方法是什么。答案不一定是任何特定的语言,一般的结构化英语算法会很好,但如果它必须是某种语言,我更喜欢C ++或Java或类似的。
编辑:我不需要这个密码可以解密,这个算法将所有单个字母映射到字母'w'但是将字符串'have'映射到字符串'jon'也应该没问题(那么字符串“玛丽有一只小羊羔。”将成为“Wwww jon w wwwwww wwww。”)。我希望算法完全通用。
答案 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
对于任何其他角色都是可变的。