2012-04-12 17 views
1

私は最も長い単語を再帰的に見つけ出す必要がありますが、コードを書いていますが、うまく機能しません。文中で最も長い単語を再帰的に見つける

 public static String longestWord(String sentence) 
{ 
    int i = sentence.indexOf(" "); 

    if (i==-1){ 
     return sentence; 
    } 

    else{ 
     String first = sentence.substring(0,i); 
     String rest = sentence.substring(i+1); 

      if(first.length()>=rest.length()){ 
       return longestWord(first); 
      } 
     else{ 
      return longestWord(rest); 

     } 

    } 
} 
+1

これは問題ではありません。あなたが混乱しているビットを見つけて、質問としてそれらを言い直してください。 SOはあなたの宿題を解決するサイトではないことを覚えておいてください。 – SCdF

+1

ようこそStackOverflowへ。これは宿題の質問ですか?その場合は、宿題タグを追加する必要があります。デバッガを使用してコードをステップ実行して、期待どおりに動作していないものを確認しましたか?一式の非稼動コードを掲示し、「間違っているものを修正してください」と言っても、このサイトには適切な質問ではありません。ここで質問する方法や質問するのに適切な質問(さらには質問してください)をよく知るために[FAQ](http://stackoverflow.com/faq)を読んでください。ここに。ありがとう。 :) –

+1

再帰的にする必要がありますか?または許容ループですか? – kasavbere

答えて

2

ライン:代わりの長さを比較する:それは動作しない理由は、あなたがlongestWord(rest)の長さを無視しているということである

String res = longestWord(rest); 
if(first.length() >= res.length()) 
+0

必ずしもそうではありません。これは便利な最適化です。明らかに、最初の単語が少なくとも残りの文字列と同じ長さであれば、残りの文字列は長い単語を含むことはできません。 – Kaz

+0

しかし、elseパスは元のバージョンで最も長い単語を破棄することがあります。 –

+0

これは正しい問題であり、最適化の問題ではありません。 – bdares

1

if(first.length() >= rest.length()) 

は次のように読んでください最初の単語の長さと文の残りの部分の長さを、最初の単語の長さと残りの文章で見つかる最長の単語の長さと比較する必要があります。

String first = sentence.substring(0,i); 
String rest = longestWord(sentence.substring(i+1)); 
return first.length()>=rest.length() ? first : rest; 
1

あなたの基本的なアプローチは正気です:最初の単語、および文字列の残り:あなたは2に入力を壊しています。しかし、その後、ロジックは少し不安定になります。

最初の単語が長い文字列の全体の残りの部分よりもある場合は、あなただけのfirstを返すべきではなく、longestWord(first)(あなたがそのケースを扱う行い、にもかかわらず:longestWordは単語が分割し、それを返すことができないことに気づくだろうにです。無意味だが)。

第2に、そうでない場合、最初の単語が最長の単語ではないと考えることはできません。返される値はlongestWord(rest)ですが、その単語の長さをfirstの長さと比較する必要があります。その単語が長い場合は、それを返します。それ以外の場合はfirstを返します。

再帰による「分割と征服」の本質は、問題のいくつかの小さなバージョンを解決し、それらの結果を統合することです。この第二の部分を忘れないでください。これはバイナリ検索ツリーの検索ではなく、データを整理してスペースの半分に再帰したり、答えを見つけることができます。一番長い言葉がどこにあるのかわからない。

1

これが問題を解決するための別のアプローチである:

public static String longestWord(String sentence) { 
    return longest(sentence.split("\\s+"), 0, 0); 
} 

private static String longest(String[] words, int idx, int longest) { 
    if (idx == words.length) 
     return words[longest]; 
    return longest(words, idx+1, 
     words[idx].length() > words[longest].length() ? idx : longest); 
} 

まず、longestWord()に文を単語の配列を生成し、そのスペースで分割します。その時点から、方法longest()は、これ以上発見されない単語がなくなるまで、longestパラメータでこれまでに発見された最も長いインデックスのインデックスを渡すすべての単語に対して反復的に反復処理を行います。これは効率的な答えです。各ステップで部分文字列を作成しないためです。

1
package com.kota.java; 
import java.util.*; 

class LongestWord{ 
    String str = "Ram is intelligent boy"; 
    String stringArray[] = str.split("\\s"); 

    public String compare(String st1, String st2) { 
     if (st1.length() > st2.length()) { 
      return st1; 
     } else { 
      return st2; 
     } 
    } 

    LongestWord() { 
     String word = ""; 
     for (int i = 0; i < stringArray.length; i++) { 
      if (i == 0) { 
       word = stringArray[0]; 
      } 
      word = compare(word, stringArray[i]); 
     } 
     System.out.println("Longest word = " + word); 
    } 

    public static void main(String[] args) { 
     new LongestWord(); 
    } 
} 
/** 
* Out put : Longest word = intelligent 
* 
* */ 
関連する問題