-2

我想在下一个单词之间没有空格的句子。

例子 :

String str = "johncancomewithme";

我想按如下方式打印字符串:

"john can come with me"

我主要关心的是专有名词的出现

4

1 回答 1

0

有很多因素需要考虑。字符串是否可以包含多个有效句子(herowedashore = he rowed ashore AND hero wed ashore)?你有你需要的所有单词的列表,包括名字和专有名词吗?如果是这样,这应该很容易解决。

首先,您可能希望将单词列表加载到内存中,或者如果它太大,请为常用单词设置某种缓存系统。我认为 Java HashMap 将是存储单词库的最快方法。

首先将您的字符串拆分为一个字符字符串的数组(这里有很多替代方法,这只是一种方法):

String[] splitStr = str.split("");

然后,您想从索引 0 开始遍历您的数组。遍历每个字母,将其添加到临时字符串,直到您的临时字符串形成一个完整的单词。然后,将其存储在堆栈实现中(您也可以使用另一个数组,也许是 Java ArrayList):

String word = "";
for (int i = 0; i < splitStr.length; i++) {
    word = word + splitStr[i];
    if (mapOfValidWords.get(word) != null ){ 
        sentence.push(word); //Assuming sentence is a stack implementation
        word = "";
    }

继续这样做,直到你到达字符串的末尾。如果在循环结束时您有任何剩余字符(单词!=“”)并且它与您的单词列表不匹配,您可以假设一个或多个单词不是这句话所需要的。

如果原始字符串是“hewillwalktowardsthecastle”,您的第一次迭代将为您提供“he will walk to ward sthecastle””

您需要从堆栈“病房”中弹出先前接受的单词,将计数器减少该单词的长度,然后跳过您先前认为有效的单词,看看是否还有另一个更长的有效单词。如果没有,您将不得不返回并弹出堆栈的下一个单词,并执行相同的操作。在这种情况下,你会得到“he will walk to wardsthecastle”,最后是“he will walk to the castle”。

假设一个有效的输入,最终你会到达一个点,你的句子在堆栈中被分成不同的值,你可以从那里重建它。

这仅返回一个答案。如果您需要返回多个答案,那么一旦您到达第一个答案的结尾,您将需要再次遍历您的字符串,并且每次“命中”上一次迭代中的单词都需要再次尝试一个字母,这次是继续经过您第一次通过时停止的点。

这很可能通过递归来完成,因为您将拥有一个树状结构。您的第一句话将是根案例,并且每个更深的级别都将尝试使用在第一句话中成功的单词更进一步。如果该级别的递归找到匹配项,它将在它自己的递归分支中再次发生这种情况。最终,您将达到无法从字符串中形成更多句​​子的地步。

于 2017-06-12T07:31:28.613 回答