检查长随机字符串(C++)中可能的英语单词

check possible english words in long random string (C++)

本文关键字:英语单词 C++ 随机 字符串 检查      更新时间:2023-10-16

给定一个随机字符串:

KUHPVIBQKVOSHWHXBPOFUXHRPVLLDDAPPLEWPREDDVVIDWQRBHBGLLBBPKQUNRVOHQEIRLWOKKRDD

如何检查随机字符串中是否包含可能的英语单词?

搜索这个字符串中所有可能的英语单词最有效的方法是什么?

我已经下载了英语词典文本文件。

我想比较字符串和英语词典文本文件,找出可能的单词。

有人能给我一些提示吗?

我建议使用暴力方法。在使用此方法后,您可以稍后进行优化。

蛮力算法:

For each word in the dictionary,
  search the string for that word. 

其他方法可能需要更长的时间。你将不得不问自己,"花时间让这种算法更高效值得吗?"

对于不经常使用的情况,答案是否定的。作为对在线法官的回答,也许你需要提高效率。如果你有很多这样的字符串,那么也许你应该优化算法。

您可以根据字典中的单词构建DAG,并使用它来搜索命中率。例如,如果您的字典中包含单词

  • 自动
  • 高速公路
  • 奥地利

这将导致类似的图形

a -> u -> t -> o -> 'hit'
      |         |
      |         |-> b -> a -> h -> n -> 'hit'
      |
       -> s -> t -> r -> i -> a -> 'hit'

基于这个数据结构源(这里有一个库),你可以从随机字符串的每个位置开始输入字母,直到没有边缘可以跟随,或者直到你获得命中为止。

由于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;