【问题标题】:Find the longest word in a string recursively递归查找字符串中最长的单词
【发布时间】:2011-03-28 06:47:25
【问题描述】:

如何递归查找字符串中最长的单词?

编辑

已完成,谢谢大家。这是修改后的代码。

public static String longestWord(String sentence)
{
    String longest;

    int i = sentence.indexOf(' ');

    if (i == -1)
    {
        return sentence;
    }

    String first = sentence.substring(0,i);
    first = first.trim();
    String rest = sentence.substring(i);
    rest = rest.trim();

    longest = stringcompare(first,longestWord(rest));

    return longest;
}

【问题讨论】:

  • 欢迎来到 Stack Overflow,@john!只是为了让您知道将来,当您混合制表符和空格时,格式化程序并不真正喜欢它。这次我给你修好了。
  • 假设这是“家庭作业”或非正式的学习练习,提示形式的答案将是最合适的
  • 只是我的一个小毛病:请不要大写方法名称或变量
  • 您说的是 Word,对吧?这是我的一个错误,我从来没有解决过。讲师给了我们用于自动评分程序的方法名称,所以我无法更改它们。
  • @john - 1) 尽快修复“Word”。不要养成坏习惯!!! 2) 如果您的讲师真的 选择了“StringCompare”作为方法 名称,那么他/她不应该教Java! (我怀疑它实际上是一个类名......你误读了一些东西。)

标签: java string recursion


【解决方案1】:

首先让我们假设句子字符串参数没有任何前导或尾随空格。您通过调用 trim() 来为递归情况执行此操作是明智的。

然后我们需要定义两种情况,基本情况和递归情况。

基本情况是找不到空格,即传入的句子只有一个单词。在这种情况下,只需返回句子。

在递归的情况下,我们得到第一个单词,其余的和你一样。在句子的其余部分调用longestWord。然后只需返回第一个单词中最长的单词以及递归调用返回的任何内容。

【讨论】:

  • 谢谢!我不知道我只需要拆分一次......递归对我来说仍然是黑魔法。我会发布修改后的代码,以防有人想看。
  • @john:关于递归的事情是,当你编写递归代码时,你只需要在代码中分解问题一次——因为代码会根据需要一次又一次地调用自身,直到问题完全解决。然后可以解决子问题并通过递归调用返回部分答案(即句子的 PART 中最长的单词),直到可以解决原始问题,然后您就有了答案。
【解决方案2】:

提示 1:

把问题分成两部分:

  • 将字符串拆分为第一个单词和字符串的其余部分
  • 找出最长的 ...

提示 2:

如果初始输入字符串中没有前导和尾随空格,则问题更容易解决。

【讨论】:

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

    【讨论】:

      【解决方案4】:

      尝试使用

      分割字符串
       String[] words = sentance.split(" ");
       String longest = null;
       String longestSize = 0;
       for (String str: words) {
          int size = str.length();
      
          if (longestSize < size) {
              longest = str;
              longestSize = size;
          }
       }
      

      【讨论】:

      • 为什么投票赞成?我喜欢这个解决方案,但它没有回答如何递归执行的问题......
      • 从未见过它必须使用递归的任何要求,除了家庭作业,我认为没有其他理由这样做,所以我从未使用过递归,这是一项很好的工作!
      • @Platinum 没有进行辩论,我认为这个问题是创建一些正确代码的问题,OP 说他们正在递归地做,但没有说它必须是递归的?如果有人说他们用锤子敲坚果有问题,我会教他们如何使用坚果饼干。
      • 好吧,如果你仔细看看问题的结尾,你会发现这是一个类。在 CS 课程中,用锤子敲碎坚果是很常见的。 :-)
      • 那不是原始问题文本的一部分,我离开了这里
      猜你喜欢
      • 2023-04-08
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2011-07-21
      • 2022-06-23
      • 2021-05-23
      相关资源
      最近更新 更多