尝试递归使用StringBuilder,接收错误,指示它对该类无效

时间:2017-02-05 04:53:13

标签: java stringbuilder

编辑:我应该提到,这是专门针对递归解决方案的任务。

我试图递归检查一个句子是否是一个“严格”的回文,这意味着它尊重空间 - “能够我,我看到了厄尔巴!” - 或者如果它是一个“普通的”回文,意味着空间被忽略 - “一个人,一个计划,一条运河,巴拿马!”。

如果我尝试使用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是它所在类的名称。

我一直在疯狂地寻找,但对于这样一个细微差别的问题,这似乎是一个愚蠢的解决方案,我无法找到答案。我不确定我哪里出错了,或者是什么导致了这些问题。

如果这里有人能帮助我理解,我会非常感激。

谢谢,

克里斯

1 个答案:

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