递归地查找句子中最长的单词

时间:2012-04-12 00:21:45

标签: java string recursion

所以我需要递归地找到最长的单词,我已经编写了代码,但它不起作用,我不知道要修复什么。

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

        }

    }
}

5 个答案:

答案 0 :(得分:2)

该行:

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

应如下所示:

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

答案 1 :(得分:1)

它不起作用的原因是你忽略了longestWord(rest)的长度:你应该比较初始单词和句子其余部分的长度,而不是比较初始单词的长度。在句子的其余部分找到的最长单词的长度。

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

答案 2 :(得分:1)

你的基本方法是理智的:你将输入分为两个:第一个单词和字符串的其余部分。但随后逻辑被扼杀了一点点。

如果第一个单词比字符串的其余部分长,则应该返回first,而不是longestWord(first)(尽管如此,您确实会处理这种情况:longestWord会注意到这个词不能拆分而只是归还它。虽然这是毫无意义的。

其次,如果不是这种情况,则不能假设第一个单词不是最长的单词。您必须捕获longestWord(rest)的返回值,然后将该字词的长度与first的长度进行比较。如果该单词更长,则返回它。否则返回first

通过递归“分而治之”的本质是你解决问题的一些较小版本,然后整合这些结果。别忘了这第二部分。这不是二元搜索树搜索,其中数据被组织为使得您可以只递归到空间的一半或另一半来找到答案。你不知道最长的单词可能在哪里。

答案 3 :(得分: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参数中找到的最长索引的所有单词,直到没有更多单词为止。这是一个有效的答案,因为它不会在每一步创建子串。

答案 4 :(得分: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
 * 
 * */