回文 StackOverflow 错误
palindrome StackOverflow Error
我尝试用递归来解决回文问题。我在线程 "main" java.lang.WhosebugError 中遇到异常
在 java.lang.String.substring(String.java:1969)
在 Main.isPalindrome(Main.java:160)
但是,我不知道如何修复它。
public static boolean isPalindrome(String s) {
int len = s.length();
if (len <= 1) return true;
else {
char ch1 = Character.toLowerCase(s.charAt(0));
char ch2 = Character.toLowerCase(s.charAt(len - 1));
boolean check1 = Character.isLetter(ch1) || Character.isDigit(ch1);
boolean check2 = Character.isLetter(ch2) || Character.isDigit(ch2);
if (check1 && check2) {
if (ch1 == ch2) {
String shorter = s.substring(1, len - 1);
return isPalindrome(shorter);
}
else {
return false;
}
}
else if (!check1 && check2) {
String shorter = s.substring(1);
return isPalindrome(shorter);
}
else if (!check2 && check1) {
String shorter = s.substring(0, len - 1);
return isPalindrome(shorter);
}
else {
String shorter = s.substring(1, len - 1);
return isPalindrome(shorter);
}
}
}
很难说不知道哪一行是 160。也就是说,您可能使用与方法本身相同的参数调用它,因此没有什么可以结束递归。
你的逻辑没有问题。只是用于保存堆栈帧的内存量有限,因此递归级别的数量有限。当输入字符串足够大时,将抛出 WhosebugError
。
我的建议是放弃这种递归实现,改用循环。
我尝试用递归来解决回文问题。我在线程 "main" java.lang.WhosebugError 中遇到异常 在 java.lang.String.substring(String.java:1969) 在 Main.isPalindrome(Main.java:160)
但是,我不知道如何修复它。
public static boolean isPalindrome(String s) {
int len = s.length();
if (len <= 1) return true;
else {
char ch1 = Character.toLowerCase(s.charAt(0));
char ch2 = Character.toLowerCase(s.charAt(len - 1));
boolean check1 = Character.isLetter(ch1) || Character.isDigit(ch1);
boolean check2 = Character.isLetter(ch2) || Character.isDigit(ch2);
if (check1 && check2) {
if (ch1 == ch2) {
String shorter = s.substring(1, len - 1);
return isPalindrome(shorter);
}
else {
return false;
}
}
else if (!check1 && check2) {
String shorter = s.substring(1);
return isPalindrome(shorter);
}
else if (!check2 && check1) {
String shorter = s.substring(0, len - 1);
return isPalindrome(shorter);
}
else {
String shorter = s.substring(1, len - 1);
return isPalindrome(shorter);
}
}
}
很难说不知道哪一行是 160。也就是说,您可能使用与方法本身相同的参数调用它,因此没有什么可以结束递归。
你的逻辑没有问题。只是用于保存堆栈帧的内存量有限,因此递归级别的数量有限。当输入字符串足够大时,将抛出 WhosebugError
。
我的建议是放弃这种递归实现,改用循环。