如何在Haskell中通过双字符串模式匹配实现转子加密?
在Haskell中实现单表替换加密
需求说明
基于给定的两个字符串实现加密:
- 原字母表:
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" - 替换表:
"EKMFLGDQVZNTOWYHXUSPAIBRCJ"
要求输入明文HELLO时,输出密文QLTTY。
实现思路
这是典型的单表替换加密:明文中的每个字母,对应替换表中相同位置的字母(原字母表第n个字符 → 替换表第n个字符)。我们可以通过构建字符映射表,再对明文逐个字符替换来实现。
代码实现
基础版本(列表映射)
-- 定义原字母表和替换表 alphabet :: String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" cipherTable :: String cipherTable = "EKMFLGDQVZNTOWYHXUSPAIBRCJ" -- 构建字符映射:将原字母与替换字母配对 cipherMap :: [(Char, Char)] cipherMap = zip alphabet cipherTable -- 单字符加密:查找映射表,未匹配则返回原字符 encryptChar :: Char -> Char encryptChar c = case lookup c cipherMap of Just encrypted -> encrypted Nothing -> c -- 字符串加密:对每个字符应用加密逻辑 encrypt :: String -> String encrypt = map encryptChar
优化版本(Data.Map 提高查找效率)
如果需要处理大量字符,用Data.Map构建映射会更高效:
import qualified Data.Map as Map alphabet :: String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" cipherTable :: String cipherTable = "EKMFLGDQVZNTOWYHXUSPAIBRCJ" -- 构建Map类型的映射表 cipherMap :: Map.Map Char Char cipherMap = Map.fromList $ zip alphabet cipherTable -- 单字符加密:未匹配则返回原字符 encryptChar :: Char -> Char encryptChar c = Map.findWithDefault c c cipherMap -- 字符串加密 encrypt :: String -> String encrypt = map encryptChar
测试验证
在GHCi中运行测试:
*Main> encrypt "HELLO" "QLTTY"
说明
- 两个版本核心逻辑一致:通过
zip将原字母表与替换表配对,形成字符映射关系,本质上是利用模式匹配完成查找。 - 代码兼容非字母字符:输入中的非大写字母会直接返回原字符。
内容的提问来源于stack exchange,提问作者Palma Rey
相关产品推荐
相关产品推荐

