我对针对以下问题提出的基本 R/Python 解决方案(即不依赖外部包/库)感兴趣:
你有一本包含数百万有效英语单词的大字典。你会得到一个输入的“单词”,它可能是也可能不是字典中一个或多个单词的字谜。在字典中查找输入可能是字谜的所有可能的有效单词。请注意,输入的“单词”可能没有意义。例如,
输入:lloeh 输出:你好
输入:cksli 输出:slick, licks
您不想使用蛮力技术来计算每个输入目标的所有可能字符组合并将它们与字典进行比较,而是希望使用更有效的技术。
我正在考虑的方法是预先计算目标语言中不可能的字符串起始。例如,在英语中,起始序列 ^ck 和 ^ng 是不允许的,因为它们违反了语言的拼写和语音约束。在运行时给定一个不可能的序列的离线列表,您将从目标逐步构建可能的“单词”。在每次迭代期间,可能的单词会根据不可能的_sequences 列表进行检查,如果它与向下搜索匹配,则终止该搜索分支。R 中的以下伪代码使用for
循环来说明我的想法。
target <- "cksli"
impossible_list <- c("ck", "ng", "rt", "zz") # pre-computed not-possible English onsets
for (i in 1:nchar(target)) {
word <- substr(target, i, i)
if (word %in% impossible_list) break
for (j in 2:nchar(target)) {
word <- paste0(word, substr(target, j, j))
if (word %in% impossible_list) break
for (k in 3:nchar(target)) {
### same logic
### goes deeper and deeper
}
}
}
(1) 我的提案的基本逻辑有什么问题吗?(2) 显然嵌套的 for 循环是不优雅的 - 可以递归地做到这一点,如果可以,怎么做?(3) 应该考虑哪些其他方法?