【问题标题】:Recursion string in JAVAJAVA中的递归字符串
【发布时间】:2018-12-20 15:44:08
【问题描述】:

我正在使用 JAVA 编写,我编写了一个递归布尔函数,它获取 2 个字符串,如果第一个字符串是第二个字符串的前缀,则应该返回。 我的代码:

public static boolean prefix(String s, String t)
{
    int i = s.length()-1;
    if (s.charAt(i) == t.charAt(i) && s.length() >= 0)
    {
        return true;
    }
    return false;
}

例如,如果我在主要写作:

s = "Del";
f = "Delight";

该功能也可以正常工作。

但如果我写的是s = "Dellll"、f = "Dell",它会说“越界”。为什么?

第二件事是它不适用于大小字符。例如:

s ="Dell"
f ="dell" 

对于上述情况,它将返回 true。

谢谢。

【问题讨论】:

  • 这看起来不是递归的?你也可以使用s.length()-1 来获取s 的最后一个字符和 t 但是t 可能更短,在这种情况下它会抛出IndexOutOfBoundsException
  • 如果你想检查一个前缀,为什么不直接使用startsWith方法呢?

标签: java string recursion


【解决方案1】:

使用开箱即用的解决方案怎么样?

public static boolean prefix(String str, String prefix) {
    return str.startsWith(prefix);
}

如果你真的需要递归:

public static boolean prefix(String str, String prefix) {
    if (str == null || str.isEmpty())
        return prefix == null || prefix.isEmpty();
    if (prefix == null || prefix.isEmpty())
        return true;
    if (str.charAt(0) != prefix.charAt(0))
        return false;
    // remove first character of each string and go to next iteration
    return prefix(str.substring(1), prefix.substring(1));
}

【讨论】:

  • 谢谢!我使用了第二个代码。它也不能正常工作。
  • @liemM 哪个测试用例不适用于我的解决方案?
  • 如果 srt = "sssss", prefix = "f" 它会起作用,一个问题解决了。但是如果str = "Dell", prefix = "Dell" -> 会返回false
【解决方案2】:

这是因为您将i 声明为:

int i = s.length()-1;

然后在Strings 中调用ith 字符

if (s.charAt(i) == t.charAt(i) && s.length() >= 0)

但如果第一个 String 大于第二个 i 将超出范围。更简单的方法是使用内置方法startsWith,它:

测试此字符串是否以指定的前缀开头。

所以你的方法可以很简单:

return t.startsWith(s);

或者如果您不能使用内置方法,那么您需要检查第一个 String 是否大于第二个:

if (s.charAt(i) == t.charAt(i) && s.length() >= 0 && s.length() < t.length())

【讨论】:

    【解决方案3】:

    越界意味着,由于第二个字符串比第一个字符串短,您正试图访问一个不存在的字符。只需检查函数开头的两个长度,并根据需要在内部切换参数。

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 2020-06-26
      • 2013-02-05
      • 2014-07-10
      • 1970-01-01
      • 2012-08-24
      • 2015-04-07
      • 2014-08-11
      • 2013-05-27
      相关资源
      最近更新 更多