给出随机字符串:
KUHPVIBQKVOSHWHXBPOFUXHRPVLLDDAPPLEWPREDDVVIDWQRBHBGLLBBPKQUNRVOHQEIRLWOKKRDD
如何检查随机字符串中是否包含可能的英文单词?
搜索此字符串中嵌入的所有可能英语单词的最有效方法是什么?
我已经下载了英文字典文本文件。
我想比较字符串和英文字典文本文件以找到可能的单词。
任何人都可以提供一些提示吗?
答案 0 :(得分:0)
我推荐蛮力方法。在使用此方法后,您可以稍后进行优化。
蛮力算法:
For each word in the dictionary,
search the string for that word.
其他方法可能需要更长时间。你将不得不问自己,“花时间让这个算法更有效率吗?”
对于不经常使用,答案是否定的。作为在线评委的答案,也许你需要提高效率。如果你有很多像这样的字符串,那么也许你应该优化算法。
答案 1 :(得分:0)
您可以根据字典中的字词构建DAG,并使用此字符搜索匹配。例如,如果您的词典包含单词
这将导致像这样的图表
a -> u -> t -> o -> 'hit'
| |
| |-> b -> a -> h -> n -> 'hit'
|
-> s -> t -> r -> i -> a -> 'hit'
根据此数据结构(here is a library for this),您可以开始从随机字符串中的每个位置开始输入字母,直到没有边缘或者直到您获得匹配为止。
由于DAG未更新,因此可以通过从随机字符串中的不同位置开始并行完成。
以下是如何构建这样的搜索结构:
// Inserts keys into a simple dawg.
dawgdic::DawgBuilder dawg_builder;
dawg_builder.Insert("auto");
dawg_builder.Insert("autobahn");
dawg_builder.Insert("austria");
// Finishes building a simple dawg.
dawgdic::Dawg dawg;
dawg_builder.Finish(&dawg);
// Builds a dictionary from a simple dawg.
dawgdic::Dictionary dic;
dawgdic::DictionaryBuilder::Build(dawg, &dic);
// Checks if a key exists or not.
if (dic.Contains("auto"))
std::cout << "auto: found" << std::endl;
// Finds a key and gets its associated record.
if (dic.Find("august") < 0)
std::cout << "august: not found" << std::endl;