2017-06-12 51 views
-2

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

例子:

String str = "johncancomewithme"; 

我想打印字符串如下:

"john can come with me" 

我主要担心的是专有名词

+1

你需要有一个所有单词的大列表来实现这一点。 – moritzg

+0

我有一大堆单词。但我不知道如何在java中做到这一点。 – Ilham

+2

你需要付出努力并尝试一些你自己的东西。 –

回答

0

有许多因素要考虑的发生。字符串是否可以有多个有效的句子(herowedashore =他划到岸边而英雄结了岸)?你有没有列出你需要的所有单词,包括名字和专有名词?如果是这样,这应该很容易解决。

首先,您可能想要加载内存中的单词列表,或者如果它太大,为常用单词提供某种缓存系统。我认为Java HashMap将是存储您的银行字的最快方式。

开始通过分割你的字符串成一个字符串数组(这里还有许多替代方案,这只是单程):

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

然后,要循环thorugh您的数组索引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”,你的第一次迭代都会给你。“他会走到病房sthecastle””

你需要跳出以前接受过这个词你的筹码‘病房’的,按照该单词的长度递减计数器,并跳过先前认定的有效单词,看看是否还有另一个有效单词的时间较长;如果不是,则必须往后退一步,弹出堆栈中的下一个单词,同样的,在这种情况下,你会得到“他将步行前往城堡”,然后最后“他将走向城堡”

假设一个有效的输入,最终你会达到一个点,你的句子是分离的编辑成堆栈中的不同值,并且可以从那里重新构建它。

这只是返回一个答案。如果你需要返回多个答案,那么一旦你达到你的第一个答案的结尾,你需要再次通过你的字符串,并且每一个来自上一次迭代的单词的“击中”需要再次尝试一个字母来尝试,这次是继续超过你第一次经过时停下的点。

这很可能是通过递归完成的,因为您将拥有一个类似于结构的树。你的第一句话将是根本原因,而更深层次的每一个句子都会试图在第一句话中取得成功。如果这种递归级别找到了匹配,那么它将会是它自己的递归分支,而这又会发生。最终你会达到一个点,从字符串中不能再形成句子。