0

課題の場合、再帰を使用して文の中で最も長い単語を見つけることになっています。文の最初の2つの単語を取得して比較し、次に2つのうち長い方の単語を取得して、それを文の残りの単語と比較するメソッドを作成しました。私のロジックはチェックアウトしますが、メソッドは正しく機能しません。スペースを奪うまぐれがあると思うので、動かないのです。

public static String longestWord(String sentence)
{
    if (sentence.indexOf(' ') == -1) {      // IF sentence only has one word
        return sentence;
    }

    String word1 =(sentence.indexOf(" ") != -1)? sentence.substring(0, sentence.indexOf(" ")):
                                                    sentence.substring(0);
    String temp = sentence.substring(sentence.indexOf(" ")+1);


    String word2 = null;
    String rest = null;
    if (sentence.indexOf(" ") != -1)    {
     word2 = (temp.indexOf(" ") != -1)? temp.substring(0, temp.indexOf(" ")+1):
                                            temp.substring(0);
     rest = temp.substring(temp.indexOf(" ")+1);
    }


    if (word1.length() > word2.length()) {
        return longestWord(word1 + rest);

    }

    if (word2.length() > word1.length())  {
        return longestWord(word2 + rest);

    }

    return sentence;


}
4

6 に答える 6

1

これを再帰的に行う簡単な方法があります。文字列を単語に分割してから、次のようにこのメソッドを再帰的に呼び出します。

string longest(string sentence) {
    return longestRecursive(sentence.Split(' '), 0, "");
}

string longestRecursive(string[] words, int index, string longestSoFar) {
    // This should be very easy to implement:
    // If index == words.Length, longestSoFar is your answer
    // Check words[0] against longestSoFar, and make a recursive invocation
}
于 2012-12-10T03:33:14.943 に答える
1

ここにはいくつか問題がありますが、最初にスペースがないように設定restしているのに、最初に単語を連結していることが問題だと思います。つまり、「クイックブラウンフォックス」->「クイックブラウンフォックス」です。

ただし、それに加えて、2つの単語が同じ長さの場合は、文全体が返されます。代わりに、最後のステートメントをステートメントにして、最後ifelseステートメントを削除する必要がありますreturn

編集:あなたはおそらくあなたが持っているものを捨てたくないでしょうが、焦点を逆にすると再帰的な解決策がより簡単になるかもしれません:毎回最初の2つの単語を取る代わりに、最初の単語だけを取り、それを比較します残りの最長の単語:

longestWord(String sentence) {
    if (sentence.indexOf(' ') == -1) {      // IF sentence only has one word
        return sentence;
    }
    String firstWord = getFirstWord(sentence);//how you're doing it now
    String rest = getRest(sentence);//Just the sentence without the first word (and first space...)
    String secondWord = longestWord(rest);
    return firstWord.length >= secondWord.length ? firstWord : secondWord;
}
于 2012-12-10T03:34:55.170 に答える
0

文が文字列の場合。

String.Split(" "); を使用して文を分割します。

結果を文字列配列に格納します。

再帰を使用して、.length を使用して最長の文字列を見つけます。

于 2012-12-10T03:35:50.263 に答える
0

Java は末尾呼び出しの最適化を行わないため、これによりスタックが簡単に吹き飛ばされる可能性があります。しかし、再帰を要求しました (そして、TCO を使用する言語では、スタック ニュートラルです)。単一の文字列のみを構築することに注意してください。

public static String longestWord(String sentence) {
    return longestWordHelper(sentence, 0, 0, 0, 0);
}

String longestWordHelper(String sentence,
                         int best_len, int best_end,
                         int cur_len, int cur) {
  if (cur == sentence.length()) 
    if (cur_len > best_len)
      return sentence.substring(cur_end - cur_len, cur_len);
    else
      return sentence.substring(best_end - best_len, best_len);
  if (isSpace(sentence.charAt(cur)))
    if (cur_len > best_len)
      return longestWordHelper(sentence, cur_len, cur, 0, cur + 1);
    else
      return longestWordHelper(sentence, best_len, best_end, 0, cur + 1);
  else
    return longestWordHelper(sentence, best_len, best_end, cur_len + 1, cur + 1);
}
于 2012-12-10T04:43:55.923 に答える
0

私はそれをするだろう

public static String longestWord(String sentence) {
        return longestWord(sentence, "");
    }

    private static String longestWord(String sentence, String longestWord) {
        int i = sentence.indexOf(' ');
        if (i == -1) {
            return sentence.length() > longestWord.length() ? sentence : longestWord;
        }
        longestWord = i > longestWord.length() ? sentence.substring(0, i) : longestWord;
        sentence = sentence.substring(i + 1);
        return longestWord(sentence, longestWord);
    }
于 2012-12-10T03:48:32.990 に答える