2017-06-12 5 views
-2

次の単語の間にスペースを入れない文を鳴らしたい。単語をJavaで壊す

例:私は次のように文字列を印刷したい

String str = "johncancomewithme"; 

"john can come with me" 

私の主な関心事は、考慮すべき多くの要因がありますが固有名詞の発生

+1

これを達成するには、すべての単語の大きなリストが必要です。 – moritzg

+0

私は言葉の大きなリストを持っています。しかし、私はどのようにjavaでこれを行うには考えていません。 – Ilham

+2

自分で努力して何かを試す必要があります。 –

答えて

0

についてです。文字列に複数の有効な文があることができますか?(herowedashore =彼は陸上に並び、英雄は海岸に婚姻しましたか?)名前や固有名詞など、必要なすべての単語のリストがありますか?もしそうなら、これは容易に解けるべきです。

まず最初に、メモリ内の単語のリストをロードするか、大きすぎる場合は頻繁に使用される単語用のキャッシュシステムを用意しておきます。私はJava HashMapがあなたの銀行の銀行を保存する最も速い方法だと思います。 1つの文字の文字列の配列にあなたの文字列を分割することにより

スタート(多くの選択肢がここにありますが、これはただ一つの方法です):

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

その後、あなたは、インデックス0からあなたの配列thorughループにしたいです。あなたの一時的な文字列が完全な単語を形成するまで、各文字をループして一時的な文字列に追加します。次に、スタックの実装銀行それを(あなたにも別の配列、おそらく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 = ""; 
    } 

はこれをやって続行します。ループの終わりに残りの文字(単語!= "")があり、それがあなたの単語リストに一致しない場合、あなたはこの文が必要としていない単語のうちの1つ以上を仮定することができます。

元の文字列が「hewillwalktowardsthecastle」だった場合、あなたの最初の反復はあなたを与えるだろうが、「

を「彼はsthecastleを病棟に歩いていく」あなたはあなたのスタック 『病棟』のオフ以前に受け入れられた単語をポップする必要があります、あなたのカウンターをその単語の長さだけ減らし、以前に考えられた有効な単語をスキップして、それ以上の有効な単語があるかどうかを確認します。

有効な入力を仮定すると、最終的にはあなたのセンテンスが区切られているポイントに達するでしょう。この場合、あなたは「城下町に歩いて行きます」と言います。スタック内の異なる値に分割し、そこから再構築することができます。

これは1つの回答を返すだけです。複数の回答を返す必要がある場合は、最初の回答の最後に達したら文字列をもう一度やり直す必要があります。また、前の繰り返しの単語のすべてのヒットは、 、あなたが最初に行ったときに止まったポイントを過ぎてこの時間を続けます。

これはおそらく、構造のようなツリーを持つため、再帰によって実行される可能性があります。あなたの最初の文章は根本的なものになり、各レベルは最初の文に続く単語でさらに深く踏み込もうとします。そのレベルの再帰が一致を見つけた場合、それは再帰の独自の分岐であり、再帰が起こる場所です。最終的には、文字列から文がそれ以上形成されないところに到達します。

関連する問題