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);

        }

    }
}
4

5 に答える 5

2

この線:

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

次のように読む必要があります。

String res = longestWord(rest);
if(first.length() >= res.length())
于 2012-04-12T00:26:25.990 に答える
1

それが機能しない理由は、longestWord(rest): の長さを無視しているためです。最初の単語と文の残りの長さを比較する代わりに、最初の単語の長さと、で見つかった最長の単語の長さを比較する必要があります。残りの文。

String first = sentence.substring(0,i);
String rest = longestWord(sentence.substring(i+1));
return first.length()>=rest.length() ? first : rest;
于 2012-04-12T00:27:38.017 に答える
1

あなたの基本的なアプローチは正気です: 入力を 2 つに分割しています: 最初の単語と残りの文字列です。しかし、そのロジックは少しおかしくなっています。

最初の単語が文字列の残り全体よりも長い場合は、単にfirst, notを返す必要longestWord(first)があります (ただし、その場合は処理します:longestWord単語を分割できないことに気づき、それを返すだけです。ただし、無意味です)。

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

再帰による「分割統治」の本質は、問題のいくつかの小さなバージョンを解決し、それらの結果を統合することです。この 2 番目の部分を忘れないでください。これは、スペースの半分または他の半分に再帰して答えを見つけることができるようにデータが編成されている二分探索ツリー検索ではありません。最長の単語がどこにあるのかわかりません。

于 2012-04-12T00:27:55.770 に答える
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各ステップで部分文字列を作成しないため、これは効率的な答えです。

于 2012-04-12T00:42:07.030 に答える
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
 * 
 * */
于 2012-07-24T19:57:31.177 に答える