JAVA中的递归字符串

JAVA中的递归字符串,java,string,recursion,Java,String,Recursion,我用JAVA编写了一个递归布尔函数,它得到两个字符串,如果第一个字符串是第二个字符串的前缀,则应该返回。 我的代码: 如果我写的是主要内容,例如: s = "Del"; f = "Delight"; s ="Dell" f ="dell" 该功能也在工作 但是如果我在写s=“Dell”,f=“Dell”,它会说“出界”。为什么? 第二件事是它不适用于大小角色。例如: s = "Del"; f = "Delight"; s ="Dell" f ="dell" 对于上述情况,它将返回tr

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

如果我写的是主要内容,例如:

s = "Del";
f = "Delight";
s ="Dell"
f ="dell" 
该功能也在工作

但是如果我在写
s=“Dell”
f=“Dell”
,它会说“出界”。为什么?

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

s = "Del";
f = "Delight";
s ="Dell"
f ="dell" 
对于上述情况,它将返回true


谢谢。

这是因为您将
i
声明为:

int i = s.length()-1;
然后调用两个
字符串中的
第i个
字符

if (s.charAt(i) == t.charAt(i) && s.length() >= 0)
但是如果第一个
字符串
大于第二个,则
i
将超出范围。更简单的方法是使用内置方法,该方法:

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

因此,您的方法可以简单到:

return t.startsWith(s);
或者,如果无法使用内置方法,则需要检查第一个
字符串是否大于第二个:

if (s.charAt(i) == t.charAt(i) && s.length() >= 0 && s.length() < t.length())
if(s.charAt(i)=t.charAt(i)和&s.length()>=0和&s.length()
这是因为您将
i
声明为:

int i = s.length()-1;
然后调用两个
字符串中的
第i个
字符

if (s.charAt(i) == t.charAt(i) && s.length() >= 0)
但是如果第一个
字符串
大于第二个,则
i
将超出范围。更简单的方法是使用内置方法,该方法:

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

因此,您的方法可以简单到:

return t.startsWith(s);
或者,如果无法使用内置方法,则需要检查第一个
字符串是否大于第二个:

if (s.charAt(i) == t.charAt(i) && s.length() >= 0 && s.length() < t.length())
if(s.charAt(i)=t.charAt(i)和&s.length()>=0和&s.length()
越界意味着,由于第二个字符串比第一个短,因此您试图访问一个不存在的字符。只需检查函数开头的两个长度,并在需要时在内部切换参数。

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

使用开箱即用解决方案如何

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

使用现成的解决方案怎么样

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

这看起来不是递归的吗?您还可以使用
s.length()-1
来获取
s
t
的最后一个字符,但是
t
可能会更短,在这种情况下,它将抛出
索引自动边界异常
如果您想检查前缀,为什么不直接使用startsWith方法?这看起来不是递归的?您还可以使用
s.length()-1
来获取
s
t
的最后一个字符,但是
t
可能会更短,在这种情况下,它将抛出
indexootfboundsexception
如果您想检查前缀,为什么不直接使用startsWith方法呢?谢谢!我用了第二个密码。它也不起作用。@liemM哪个测试用例对我的解决方案不起作用?如果srt=“sssss”,prefix=“f”它会起作用,一个问题就解决了。但是如果str=“Dell”,prefix=“Dell”->它将返回错误,谢谢!我用了第二个密码。它也不起作用。@liemM哪个测试用例对我的解决方案不起作用?如果srt=“sssss”,prefix=“f”它会起作用,一个问题就解决了。但如果str=“Dell”,prefix=“Dell”->则返回false