通过在它们之间添加空格来形成一个有意义的单词

时间:2013-07-21 08:58:04

标签: c++ string algorithm trie suffix-array

您将获得一个没有任何空格的字符串示例“Iamastudent”。您将获得一个预定义的字典功能,用于验证字典中是否存在给定的单词。使用此功能,您必须在字符串中插入空格,将其打印为“我是学生”。

我的面试问题并且告诉我在c ++中也解决了,我使用动态编程解决了它,但他并不满意 我给出的解决方案是  与下面的问题相同

Given a phrase without spaces add spaces to make proper sentence

他让我用 trie 后缀数组来做这件事,但我无法找到解决方案可以帮助我

2 个答案:

答案 0 :(得分:0)

Find words and put spaces after them

答案是使用Trie数据结构。用可能的单词创建Trie并继续遍历。使用Trie,您可以生成许多不同的单词。

现在在这里“真实地”与Trie你可以产生这些话。

i, a, am, a, as, student 

现在你必须从这些词中做出正确的判断。这里可能的解决方案是马尔可夫链。马尔可夫链是一种数据结构,它保存一个单词后的下一个单词的概率。所以马尔可夫链将会。

"i" : [ "am", "did", "went" ...],
"a" : [ "tree", "dog" ..]
"am" : [ "a" ...]

现在按顺序排列这么多数据

[i], [a, am], [a, as], [student] 
  

注意:我将所有以相同字符开头的元素组合在一起   列表。

“i”开头 下一个词是“a”。但在马尔可夫链“a”不存在。所以去寻找下一个字。像这样你可以继续。

从这里起,它是dfs搜索有效句子。好吧,这是一个很好的棘手的问题。

答案 1 :(得分:-1)

如果有一个分裂句子的独特解决方案,那么使用trie进行操作很简单:

  1. 如果输入字符串中有字符,则从字符串中的根消耗字符开始向下走。否则终止。
  2. 如果它是压缩的trie,只要前缀是一个完整的单词,你就会找到一个标记,否则你会在输出空格时到达一个叶子
  3. 从字符串
  4. 中的当前位置开始,返回1(从根向下走)

    当字符串中没有其他字符时,您就完成了(您可能需要检查此时您是否正在遍历树)。

    如果解决方案不是唯一的,那么每当到达字符串的末尾并且您不在树中的标记或叶子时,您需要回溯到您发出的先前空间。你需要一个堆栈来输入字符串中的位置。