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

Posted

技术标签:

【中文标题】给定一个单词,通过在它们之间添加空格来形成一个有意义的单词【英文标题】:given a word forming a meaningful word by adding spaces in between them 【发布时间】:2013-07-21 08:58:03 【问题描述】:

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

这是我的面试问题,告诉我也用 C++ 解决,我用动态编程解决了它,但他不满意 我给出的解决方案是 和下面的问题一样

Given a phrase without spaces add spaces to make proper sentence

他让我使用 triesuffix array 来做,但我想不出任何人可以帮助我的解决方案

【问题讨论】:

我认为你以前的帖子复杂性可以通过从字典中找到以 str[pos] 开头的最大公共子序列来提高。再次从 pos+=(上面找到的子序列的长度) 开始并重复搜索。 你能说得清楚点吗? 【参考方案1】:

Find words and put spaces after them

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

现在用 Trie 在这里“iamastudent”你可以生成这些词。

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 搜索。嗯,这是一个很好但很棘手的问题。

【讨论】:

【参考方案2】:

如果存在拆分句子的唯一解决方案,那么使用 trie 进行拆分很简单:

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

当字符串中没有更多字符时,您就完成了(您可能需要检查此时您没有遍历树)。

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

【讨论】:

以上是关于给定一个单词,通过在它们之间添加空格来形成一个有意义的单词的主要内容,如果未能解决你的问题,请参考以下文章

将字符串格式化为仅在 python 中的单词之间有 n 个空格

句子反转

练习题三:句子反转

牛客网在线编程:句子反转

需要正则表达式来匹配两个单词,因为它们之间可能有任意数量的空格或其他字符

c ++如何提取单词之间的空格(如果有的话)