我试图递归检查一个句子是否是一个“严格”的回文,这意味着它尊重空间 - “能够我,我看到了厄尔巴!” - 或者如果它是一个“普通的”回文,意味着空间被忽略 - “一个人,一个计划,一条运河,巴拿马!”。
如果我尝试使用String值运行此程序,则会出现StackOverflow错误。 StringBuilder是可变的,所以我试图找到一种方法来使用它,但我找不到任何递归使用的StringBuilder的例子(我假设因为它没有意义,但我不知道为什么)< / p>
代码如下:
public static boolean isPalindrome(String userPal){
if(userPal == null){
return false;
}
else if( userPal.length() == 1 ){
return true;
}
StringBuilder testAgainst = new StringBuilder();
stringReversed(testAgainst);
// String testAgainst = stringReversed(userPal);
return userPal.equals( testAgainst );
}
public static StringBuilder stringReversed(StringBuilder toReverse){
StringBuilder reversed = new StringBuilder(toReverse);
if(toReverse == null){
return null;
}
else if(toReverse.length() <= 1){
return reversed;
}
System.out.println("This is the reverse string as it progresses: " + reversed);
// return stringReversed( reversed.substring(1)+ reversed.charAt(0) );
return stringReversed( reversed.substring(1, reversed.length() - 1 ) );
}
现在我在“return StringReversed”行上收到一条错误,指出:PalindromeCheck类型中的方法stringReversed(StringBuilder)不适用于参数(String)
PalindromeCheck是它所在类的名称。
我一直在疯狂地寻找,但对于这样一个细微差别的问题,这似乎是一个愚蠢的解决方案,我无法找到答案。我不确定我哪里出错了,或者是什么导致了这些问题。
如果这里有人能帮助我理解,我会非常感激。
谢谢,
克里斯
答案 0 :(得分:0)
您需要初始化StringBuilder
中的值,而StringBuilder
已经有reverse
方法(但它返回一个新的StringBuilder
)。保存该调用的返回值或内联使用它。像,
public static boolean isPalindrome(String userPal) {
if (userPal == null) {
return false;
} else if (userPal.length() < 2) {
return true;
}
StringBuilder testAgainst = new StringBuilder(userPal);
return userPal.equals(testAgainst.reverse().toString());
}
或消除StringBuilder
并迭代String
比较后半部分的前半部分。像,
char[] arr = userPal.toCharArray();
for (int i = 0; i < arr.length / 2; i++) {
if (arr[i] != arr[arr.length - 1 - i]) {
return false;
}
}
return true;
递归版或,
public static boolean isPalindrome(String userPal) {
if (userPal == null) {
return false;
} else if (userPal.length() < 2) {
return true;
} else if (userPal.length() == 2) {
return userPal.charAt(0) == userPal.charAt(1);
}
return userPal.charAt(0) == userPal.charAt(userPal.length() - 1)
&& isPalindrome(userPal.substring(1, userPal.length() - 1));
}