当前位置: 首页 > 知识库问答 >
问题:

使用 java 进行令人费解的递归

令狐嘉禧
2023-03-14

给定一个字符串和一个非空子字符串 sub,递归计算以 sub 开头和结尾的最大子字符串,并返回其长度。

strDist("catcowcat", "cat") → 9
strDist("catcowcat", "cow") → 3
strDist("cccatcowcatxx", "cat") → 9

我的解决方案

public int strDist(String str, String sub) {
    int i = sub.length();
    int j = str.length();
    int count = 0;
    if (str.length() == 1 && str.equals(sub)) {
        return 1;
    } else if (str.length() < sub.length() || str.length() <= 1) {
        return 0;
    }

    if (str.substring(0, i).equals(sub)) {
        if (str.substring(str.length() - i, str.length()).equals(sub)) {
            return str.length();
        } else {
            strDist(str.substring(0, str.length() - i), sub);
        }
    } else {
        strDist(str.substring(1, str.length()), sub);
    }

    return 0;
}

告诉我如何更正代码?

共有3个答案

南门飞扬
2023-03-14

我认为这是更好的递归解决方案

public int strDist(String str, String sub) {
  if (str.length()==0) return 0;
  if (!str.startsWith(sub))
      return strDist(str.substring(1),sub);
  if (!str.endsWith(sub))
    return strDist(str.substring(0,str.length()-1),sub);
  return str.length();
}
秦安宁
2023-03-14

这将“递归计算以sub开头和结尾的最大子串,并返回其长度”,如您所述。

public class PuzzlingRecursion {

    static String substringFound = "";

    public static void main(String[] args) {
        String sentence = "catcowcat";
        String substring = "cat";

        int sizeString = findNumberOfStrings(sentence, substring, 0);
        System.out.println("you are searching for: " + substring);
        System.out.println("in: " + sentence);
        System.out.println("substring which starts and ends with sub and return its length is:"+substringFound + ", " + sizeString);

    }

    private static int findNumberOfStrings(String subStringPassed,
            String setenecePassed, int count) {

        if (subStringPassed.length() == 0) {
            return count + 0;
        }
        if (subStringPassed.length() < setenecePassed.length()) {
            return count + 0;
        }
        count++;
        String lastStringMiddle = subStringPassed.replaceAll("(.*?)" + "("
                + setenecePassed + ")" + "(.*?)" + "(" + setenecePassed + ")"
                + "(.*?.*)", "$3");
        if (subStringPassed.contains(setenecePassed)
                && lastStringMiddle.length() != setenecePassed.length()) {
            if (subStringPassed.contains(setenecePassed)
                    && lastStringMiddle.contains(setenecePassed)) {
                // only found one item no pattern but according to the example
                // you posted it should return the length of one word/substring
                count = setenecePassed.length();
                substringFound = subStringPassed;
                return count;
            }
        }
        // makesure the lastSrtringMiddle has the key we are search
        if (!lastStringMiddle.equals(subStringPassed)) {
            subStringPassed = subStringPassed.replaceFirst(setenecePassed, "");
            String lastString = subStringPassed.substring(0,
                    subStringPassed.lastIndexOf(setenecePassed));
            if (null != lastString && !"".equals(lastString)) {
                count = lastStringMiddle.length() + setenecePassed.length()
                        + setenecePassed.length();
                substringFound = setenecePassed + lastStringMiddle
                        + setenecePassed;
                subStringPassed = "";
            }
            return findNumberOfStrings(subStringPassed, setenecePassed, count);
        }
        return count;
    }
}
广绪
2023-03-14

为什么这需要通过递归来完成?

编辑:修复了处理sub在str中不存在或只存在一次的情况的代码

public int strDist(String str, String sub) {
  int last=str.lastIndexOf(sub);
  if (last != -1) {
    int first=str.indexOf(sub);
    if (first != last)
      return last - first + sub.length();
    }
  }
  return 0;
}

如果适合这个问题,递归是很好的。在这种情况下,递归不会增加值,为了递归而使用递归来编写它会使代码效率低下。

 类似资料:
  • 我正在使用Java库C3PO实现与MySQL数据库的连接池。我正在记录查询前后的连接,以识别连接泄漏。我发现一个查询使用了将近20个连接,而实际上,当我检查MySQL进程列表时,它创建了50个新进程。这会导致整个webapp失败,因为后端无法再连接到数据库。 下面是导致泄漏的方法的一些伪代码。 JdbcTemboard应该关闭连接并释放资源。它不应该为一个查询使用20个连接!这些连接在查询后很长时

  • 问题内容: 我有一个使用openssl工具进行加密的bash脚本。 以及试图解密脚本生成的文件的Java代码。 当我运行Java代码时,它不会打印任何内容。脚本和Java代码之间是否不匹配? 第二个问题是我是否可以重写它以使用密码而不是key / iv。为此,是否有办法知道openssl用于给定密码的iv? 问题答案: 正如上面提到的@ Polynomial,bash脚本和Java代码之间的键和i

  • 我目前正在研究二叉树。我遇到了这个非常高效的遍历树的代码(在本例中,这是一个按顺序遍历)。它使用递归,这是我理解的一个概念。然而,我似乎无法理解这到底是如何工作的。最让我困惑的是,它是如何在每次列表中上升的,这样才能开始。左并不总是相同的数字。请有人一步一步地告诉我这是如何沿树向上移动的。提前谢谢 编辑以增加问题的清晰度: 我明白如果开始不是无,那么开始。left被添加到同一函数的递归调用中 我的

  • 我需要使用以下命令在JAVA中解密在UNIX中加密的文件: 我必须用java解密,就像在UNIX中一样 有人能给我一个java代码来做这个吗?

  • 问题内容: 我想从类型为的JSON解析数据。我正在使用Google Gson。 我有: 我的课是: 问题答案: 这是执行此操作的简单代码,我避免了所有检查,但这是主要思想。 为了使使用更加通用- 您会发现Gson的javadocs非常清楚并且很有帮助。

  • 因此,我尝试在浏览器上使用oauth使用者密钥、密钥、访问令牌和令牌密钥对rest客户端进行API调用,其工作正常,如下所示。 请告知如何在Java中实现这一点? http://imgur.com/AtYVLH5 所有oauth都显示了整个过程,但在第一次保存密钥和令牌后,如何进行API调用是个问题。 提前感谢