【问题标题】:Recursive string comparison递归字符串比较
【发布时间】:2015-10-25 22:19:29
【问题描述】:

我正在尝试比较两个字符串,看看一个字符串是否包含另一个字符串以及什么点。所以基本上我试图找到indexOf。但是,我不想使用它。

这是我编写的使用 indexOf 完美运行的代码:

import java.lang.*;

public class Index
{
  public static void indexOf(String main, String check)
  {
    System.out.println(main.toLowerCase().indexOf(check.toLowerCase()));
  }
  public static void main(String[] args)
  {
    indexOf("Barack Obama", "Obama");
  }
}

但是,问题是我不想使用 indexOf。此外,我正在尝试使代码递归

所以我尝试编写这段代码:

public class Index
{
  public static int indexOf(String main, String check)
  {

    int n = check.length();
    int i = main.length();

    int h = 0;

    for (int j = 0; j < n; j++)
    {
      if (main.charAt(j) == check.charAt(j)) h++;
    }
    return h - 1;
  }
  public static void main(String[] args)
  {
    System.out.println(indexOf("Barack", "B"));
  }
}

但是,这个完全不能按预期工作,甚至不是递归的。

无论如何,我可以让这个方法递归而不使用 indexOf?

【问题讨论】:

  • 到目前为止,这个问题太宽泛了,我们无法回答。就像我问你:“我有这辆不会飞的绿色三轮车……有什么办法可以把它变成一辆会飞的红色汽车吗?”答案是,嗯,可能。但是如何完全取决于你自己,我猜这就是家庭作业的重点。你坚持哪一个具体步骤
  • 查看维基百科中的recursive linear search section,它可能会帮助您入门。
  • @Frecklefoot 使用递归来明确迭代分配的一个常见原因是学习如何使用递归。
  • 学习这很好,但如果你尝试使用递归来解决编码蝙蝠或类似的问题,它可能会失败。

标签: java string recursion


【解决方案1】:

在使方法递归之前,以递归的方式考虑您的任务是有益的。子字符串从字符串的特定索引开始是什么意思?一种递归方式解释如下:

子字符串的索引

  • -1,如果字符串比子字符串短
  • 0,如果您的字符串以子字符串开头,或者
  • 1 + 子字符串的索引,当字符串的第一个字符已经被移除时,返回值为正数
  • -1 如果 子字符串的索引 返回 -1

高亮部分表示应用递归的地方:为了计算子字符串的索引,我们必须计算较短字符串中子字符串的索引。

这个描述几乎可以按字面意思转换为递归方法:

int indexOf(String str, String sub) {
    if (str.length() < sub.length()) return -1;
    if (str.startsWith(sub)) return 0;
    int res = indexOf(str.substring(1), sub);
    return res < 0 ? res : 1+res;
}

Demo.

【讨论】:

  • 非常感谢你。您的代码非常简洁明了。但是,你能解释一下最后一行吗?谢谢你。 :)
  • 它将返回函数将进行的递归次数。
  • @JohnSmith 最后一行是条件表达式。它检查递归调用是否返回-1,在这种情况下它也返回-1。否则,无论递归调用返回什么,它都会返回 1+。
【解决方案2】:
package com.company;

public class Index {
    public static int indexOf(String main, String check)
    {
        if (main.startsWith(check)) {
            return 0;
        } else if (main.length() < check.length()) {
            return -1;
        } else {
            int indexOf = indexOf(main.substring(1), check);
            return indexOf < 0 ? -1 : 1 + indexOf;
        }
    }
    public static void main(String[] args)
    {
        System.out.println(indexOf("Barack Obama", "Obama"));
    }
}

【讨论】:

  • 你当然是对的。我很好的例子说明了为什么“特殊”返回值不是一个好的设计模式。因为像我这样粗心的程序员忘记考虑它们了。
【解决方案3】:

如果您也不想使用startsWith(),这也可以。如果前一部分都匹配,这里检查字符串的一部分与主字符串匹配。

public class Index {

    public static int indexOf(String main, String check) {

        int i = main.length();

        for (int j = 0; j < i; j++) {
            if (main.charAt(j) == check.charAt(0)) {
                if (check.length() > 1) {
                    if (indexOf(main, check.substring(1)) == j + 1) {
                        return j;
                    }
                } else {
                    return j;
                }
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        System.out.println(indexOf("My name is XYZ", "ashfbs"));//returns -1;
        System.out.println(indexOf("My name is XYZ", "is"));//returns 8;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2015-03-21
    • 2017-07-03
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多