JAVA中的递归字符串
我用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
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