2012-04-12 93 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 2012-04-12 00:24:20

+1

歡迎來到StackOverflow。這是一個功課問題嗎?如果是這樣,你應該添加作業標籤。您是否嘗試使用調試器來遍歷代碼,以查看您所期望的不工作?發佈一堆非工作代碼並說「請修正任何錯誤」對於本網站來說不是一個合適的問題。請花幾分鐘時間閱讀[常見問題](http://stackoverflow.com/faq),以便更熟悉如何在此提問,以及哪些問題是(或不適合)提問這裏。謝謝。 :) – 2012-04-12 00:26:49

+1

它必須遞歸?或者是一個可接受的循環? – kasavbere 2012-04-12 00:31:07

回答

2

行:

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

應該象:

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

不一定。這是一個有用的優化。顯然,如果第一個單詞至少與字符串的其餘部分一樣長,則字符串的其餘部分不能包含更長的單詞。 – Kaz 2012-04-12 00:30:28

+0

但是其他路徑可能會丟棄原始版本中最長的單詞。 – 2012-04-12 00:43:52

+0

這是一個正確性問題,而不是優化問題。 – bdares 2012-04-12 00:44:29

1

它不工作的原因是,你忽略了longestWord(rest)的長度,而不是比較長最初的單詞和句子的其餘部分,你應該比較初始單詞的長度和在句子其餘部分找到的最長單詞的長度。

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

你的基本做法是明智的:你打破的輸入爲兩個:第一個字,字符串的其餘部分。但是這個邏輯有點b b。

如果第一個詞是除弦的整個休息時間越長,你應該只返回first,不longestWord(first)(雖然,你這樣做處理這種情況:longestWord會注意到這個詞不能被拆分,就回到它這是雖然沒有意義)。其次,如果不是這種情況,你就不能假設第一個單詞不是最長的單詞。您必須捕獲返回值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 
* 
* */