2017-06-12 4 views
-2

Je veux beak une phrase qui n'a pas d'espace entre les mots suivants.Rupture de mot en Java

Exemple:

String str = "johncancomewithme"; 

Je veux imprimer la chaîne comme suit:

"john can come with me" 

Ma principale préoccupation est de survenue de nom propre

+1

Vous devez avoir une grande liste de tous les mots pour y parvenir. – moritzg

+0

J'ai une grande liste de mots. mais je n'ai aucune idée sur la façon de le faire en Java. – Ilham

+2

Vous devez faire des efforts et essayer quelque chose par vous-même. –

Répondre

0

Il y a beaucoup de facteurs à considérer. Est-ce que la chaîne peut avoir plusieurs phrases valides (herowedashore = il a ramé à terre et heroes wed un rivage)? Avez-vous une liste de tous les mots dont vous avez besoin, y compris les noms et les noms propres? Si oui, cela devrait être facilement résoluble. D'abord, vous voudrez probablement charger la liste des mots en mémoire, ou si elle est trop grande, avoir un système de cache en place pour les mots fréquemment utilisés. Je pense qu'un Java HashMap serait le moyen le plus rapide de stocker votre banque de mots.

Commencez en divisant votre chaîne en un tableau d'un chaînes de caractères (il existe de nombreuses alternatives ici, c'est juste une façon):

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

Alors, vous voulez faire une boucle répercutant votre tableau de l'index 0. Boucle à travers chaque lettre en l'ajoutant à une chaîne temporaire jusqu'à ce que votre chaîne temporaire forme un mot complet. Ensuite, la banque dans une implémentation de la pile (vous pouvez utiliser un autre tableau aussi bien, peut-être un 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 = ""; 
    } 

Continuez jusqu'à ce que vous arrivez à la fin de la chaîne. Si à la fin de la boucle vous avez des caractères restants (mot! = "") Et que cela ne correspond pas à votre liste de mots, vous pouvez supposer qu'un ou plusieurs des mots n'étaient pas ce que cette phrase requiert.

Si la chaîne d'origine était « hewillwalktowardsthecastle », votre première itération vous donnera « il marchera pour conjurer sthecastle » »

Vous aurez besoin de pop le mot précédemment accepté hors de votre pile « service », décrémentez votre compteur en fonction de la longueur de ce mot, et passez votre mot précédemment jugé valide pour voir s'il y a un autre mot valide plus long sinon, vous devrez aller plus loin et faire apparaître le prochain mot de la pile, en faisant le Dans ce cas, vous obtiendrez "il marchera vers le château", puis "il marchera vers le château"

En supposant une entrée valide, vous arriverez à un point où votre phrase sera séparée ed dans différentes valeurs dans la pile, et vous pouvez le reconstruire à partir de là.

Ceci ne renvoie qu'une seule réponse. Si vous devez renvoyer plusieurs réponses, une fois que vous avez atteint la fin de votre première réponse, vous devrez réexécuter votre chaîne et chaque "hit" d'un mot de l'itération précédente doit être testé en retournant une lettre , cette fois en continuant le point où vous vous êtes arrêté lors de votre premier passage.

Cela pourrait probablement être fait par récursivité, car vous aurez une structure arborescente. Votre première phrase sera le cas racine, et chaque niveau plus profond tentera d'aller plus loin avec un mot qui a réussi dans la première phrase. Si ce niveau de récursion trouve une correspondance, ce sera pour sa propre branche de récursion où cela se reproduira. Finalement, vous atteindrez un point où plus aucune phrase ne peut être formée à partir de la chaîne.