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

时间:2015-03-03 20:16:20

标签: c++ dictionary

给出随机字符串:

KUHPVIBQKVOSHWHXBPOFUXHRPVLLDDAPPLEWPREDDVVIDWQRBHBGLLBBPKQUNRVOHQEIRLWOKKRDD

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

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

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

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

任何人都可以提供一些提示吗?

2 个答案:

答案 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;