确定输入字符串是否为回文的有效方法

时间:2018-12-24 00:39:44

标签: java string optimization palindrome

我最近写了这个简短的方法来确定字符串是否是回文。我想知道如何做才能使其更高效,肯定会丢失一些简单的内置函数来加快计算速度。

谢谢大家的帮助!

boolean checkPalindrome(String inputString) {

    ArrayList<Character> arrFront = new ArrayList<Character>();
    ArrayList<Character> arrBack = new ArrayList<Character>();

    for(int i=0; i<inputString.length()-1; i++) {
        arrFront.add(inputString.charAt(i));
    }

    for(int i=inputString.length()-1; i>0; i--) {
        arrBack.add(inputString.charAt(i));
    }

    StringBuilder builder1 = new StringBuilder(arrFront.size());
    for (Character c : arrFront) {
        builder1.append(c);
    }
    String front = builder1.toString();

    StringBuilder builder2 = new StringBuilder(arrBack.size());
    for (Character c : arrBack) {
        builder2.append(c);
    }
    String back = builder2.toString();

    return(front.equals(back));
}

4 个答案:

答案 0 :(得分:5)

就效率而言,它并不总是与内置函数和使用库有关(尽管在许多情况下,它们是最佳选择)。但是有时候,这样的简单循环可能是最简单,最有效的方法:

private boolean checkPalindrome(String inputString) {
    for(int i = 0, j = inputString.length() - 1; i < j; i++, j--) {
        if(inputString.charAt(i) != inputString.charAt(j)) {
            return false;
        }
    }
    return true;
}

答案 1 :(得分:0)

可以参考@FernandoPelliccioni的文章Check string for palindrome。他对此解决方案进行了非常详尽的分析。

简单的解决方案:

public static boolean isPalindrome(String str) {
    return str.equals(new StringBuilder(str).reverse().toString());
}

关于效率:

public static boolean isPalindrome(String str) {
    int n = str.length();
    for (int i = 0; i < n/2; ++i) {
       if (str.charAt(i) != str.charAt(n-i-1)) return false;
    }
    return true; 
}

答案 2 :(得分:0)

这是一种更简单的方法。

public boolean checkPalindrome(String str) {
    int len = inputString.length()/2;
    for(int i = 0 ; i < len ; i++) {
        if(str.charAt(i) != str.charAt(str.length()-1-i)) {
            return false;
        }
    }
    return true;
}

当str的长度为N时。时间复杂度为O(N/2)。 注意:当str的长度为奇数时,不需要检查中间字符,因为它本身就是

例如,

ssstsss中,您不需要检查t

并且由于len是int。它不能表达decimal part。它会自动下降。 len中的ssstsss之所以是3,是因为它是7/2 = 3.5并丢弃了0.5

即使长度是偶数,它也可以工作。例如,abccba。长度为6len3。如果长度为偶数,则必须检查中间的两个字符,即cc

答案 3 :(得分:0)

我认为最简单的方法是使用默认的StringBuilder
此类具有很好的功能,可能有用。 它称为reverse()。它按照它说的去做,它颠倒了被解析为StringBuilder的String。有了它,只需检查给定的String是否等于倒数即可。

例如,您可以这样做:

public boolean isPallindrome(String input){
    StringBuilder reversed = new StringBuilder(input);
    reversed.reverse();
    /*
     * Just replace equals with equalsIgnoreCase
     * to ignore the case
     */
    return(reversed.toString().equalsIgnoreCase(input));
}

给定的代码仅创建一个StringBuilder实例并直接附加输入。 然后,它反转StringBuilder并检查输入是否等于反转的字符串。