【问题标题】:Find longest word in a sentence recursively递归查找句子中最长的单词
【发布时间】:2023-04-08 22:24:02
【问题描述】:

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

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

        }

    }
}

【问题讨论】:

  • 这不是问题。请找出您感到困惑的部分,并将它们改写为问题。请记住,SO 不是为您解决家庭作业问题的网站。
  • 欢迎来到 StackOverflow。这是一个家庭作业问题吗?如果是这样,您应该添加作业标签。您是否尝试过使用调试器单步执行代码以查看哪些内容没有按您的预期工作?发布一堆不工作的代码并说“请修复任何错误”对于这个网站来说不是一个合适的问题。请花几分钟阅读FAQ,以便更熟悉如何在这里提问,以及哪些问题适合(和不适合)在这里提问。谢谢。 :)
  • 必须是递归的吗?还是可以接受循环?

标签: java string recursion


【解决方案1】:

行:

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

应该是这样的:

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

【讨论】:

  • 不一定。这是一个有用的优化。显然,如果第一个单词至少与字符串的其余部分一样长,则字符串的其余部分不能包含更长的单词。
  • 但是else路径可能会丢弃原版中最长的单词。
  • first 是最长单词时原版不正确,但是 first.length
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您的基本方法是理智的:您将输入分成两部分:第一个单词和字符串的其余部分。但是后来逻辑有点混乱。

    如果第一个单词比整个字符串的其余部分长,你应该只返回first,而不是longestWord(first)(尽管你确实处理了这种情况:longestWord 会注意到这个单词不能被拆分并且直接退货吧。不过没意义)。

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

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

    【讨论】:

      【解决方案4】:

      这是解决问题的另一种方法:

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

      【讨论】:

        【解决方案5】:
        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
         * 
         * */
        

        【讨论】:

          猜你喜欢
          • 2014-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-30
          • 1970-01-01
          • 1970-01-01
          • 2015-08-26
          相关资源
          最近更新 更多