0

我写了一个递归方法来检查一个单词是否是回文。

但我现在也希望检查字符串中的任何特殊字符 (*?!<。所以如果字符串是 ab.ba 它不是回文。

这是我所拥有的,并且 isAlphanuemerical() 在单步执行时似乎工作正常,但是如果我输入 ab.ba 它仍然会注册为回文

public static boolean isPal(String s)
{
    if(s.length() == 0 || s.length() == 1)
        return true;

    // Check if String contains any alphanumeric characters
    if (isAlphanumeric(s))
        return false;


    if(s.charAt(0) == s.charAt(s.length()-1))
        return isPal(s.substring(1, s.length()-1));//if its not the case than string is not.
    return false;
}

而我的 isAlphaneumerical() 方法

public static boolean isAlphanumeric(String str) {
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (!Character.isLetter(c) && !Character.isDigit(c))
            return false;
    }
    return true;
}
4

2 回答 2

3
if (isAlphanumeric(s))
        return false;

应该

if (!isAlphanumeric(s))
        return false;

此外,您不需要每次都调用 isAlphanumeric(s)。你可以调用它一次,或者改变它,让它只检查第一个/最后一个字符。您正在检查之前已经检查过的内容。

public static boolean isPal(String s)
{
    if (!isAlphanumeric(s))
        return false;

    return _isPal(s);
}

private static boolean _isPal(String s)
{
    if (s.length() == 0 || s.length() == 1)
        return true;

    if (s.charAt(0) == s.charAt(s.length()-1))
        return _isPal(s.substring(1, s.length()-1));

    return false;
}

private static boolean isAlphanumeric(String str) 
{
    for (int i = 0; i < str.length(); i++) 
    {
        char c = str.charAt(i);

        if (!Character.isLetter(c) && !Character.isDigit(c))
            return false;
    }
    return true;
}
于 2013-06-18T21:58:16.100 回答
1

您的代码正在按照您的要求执行。该isAlphanumeric方法工作正常。

但如果它字母数字,你的isPal回报。false

如果您不希望非字母数字字符串成为回文,请反转您的逻辑:

if (!isAlphanumeric(s))
    return false;

这使用!运算符来否定布尔结果。

于 2013-06-18T21:58:03.707 回答