用Java打破单词

时间:2017-06-12 06:42:36

标签: java string word sentence wordbreaker

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

示例:

String str = "johncancomewithme";

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

"john can come with me"

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

1 个答案:

答案 0 :(得分:0)

有许多因素需要考虑。这个字符串可以有多个有效的句子(Herowedashore =他划船上岸,英雄和岸上划船)?你有所需的所有单词列表,包括姓名和专有名词吗?如果是这样,这应该很容易解决。

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

首先将你的String拆分为一个字符串的数组(这里有很多选择,这只是一种方式):

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 = "";
    }

继续执行此操作,直到到达String的末尾。如果在循环结束时你有任何剩余的字符(单词!=&#34;&#34;)并且它与你的单词列表不匹配,你可以假设一个或多个单词是不是这句话要求的。

如果原来的字符串是&#34; hewillwalktowardthecastle&#34;,你的第一次迭代会给你&#34;他将走到病房sthecastle&#34;&#34;

您需要弹出先前已接受的字词#34; ward&#34;,按照该字词的长度递减您的计数器,并跳过之前认为有效的字词以查看是否有& #39;另一个有效的词,更长。如果没有,你将不得不再往后走,然后弹出堆栈的下一个字,做同样的事情。在这种情况下,你会得到&#34;他将走到最远的地方,然后终于&#34;他将走向城堡&#34;。

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

这只回答一个答案。如果你需要返回多个答案,那么一旦你到达第一个答案的结尾,你就需要再次查看你的字符串,并且每一次&#34;点击&#34;需要通过再次输入一个字母来尝试上一次迭代中的一个单词,这次是继续超过第一次通过时停止的点。

这可能通过递归来完成,因为你将拥有类似树的结构。你的第一个句子将是根本情况,每个级别更深一些将尝试进一步使用第一句成功的单词。如果该递归级别找到匹配,它将为它自己的递归分支再次发生。最终,您将达到不再能从字符串形成句子的程度。