检查字符串是否为回文

Upv*_*ote 86 java arrays string char palindrome

回文是单词,短语,数字或的单元的其它序列可以读取在任一方向的方式相同.

为了检查单词是否是回文,我得到单词的字符数组并比较字符.我测试了它似乎工作.但是我想知道它是否正确或是否有待改进的地方.

这是我的代码:

public class Aufg1 {
    public static void main(String[] args) {
        String wort = "reliefpfpfeiller";
        char[] warray = wort.toCharArray(); 
        System.out.println(istPalindrom(warray));       
    }

    public static boolean istPalindrom(char[] wort){
        boolean palindrom = false;
        if(wort.length%2 == 0){
            for(int i = 0; i < wort.length/2-1; i++){
                if(wort[i] != wort[wort.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            }
        }else{
            for(int i = 0; i < (wort.length-1)/2-1; i++){
                if(wort[i] != wort[wort.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            }
        }
        return palindrom;
    }
}
Run Code Online (Sandbox Code Playgroud)

dcp*_*dcp 176

为什么不呢:

public static boolean istPalindrom(char[] word){
    int i1 = 0;
    int i2 = word.length - 1;
    while (i2 > i1) {
        if (word[i1] != word[i2]) {
            return false;
        }
        ++i1;
        --i2;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

例:

输入是"andna".
i1为0,i2为4.

第一次循环迭代我们将比较word[0]word[4].它们是相等的,所以我们递增i1(它现在是1)并递减i2(它现在是3).
所以我们然后比较n的.它们是相等的,所以我们递增i1(它现在是2)并递减i2(它是2).
现在i1和i2相等(它们都是2),因此while循环的条件不再成立,因此循环终止并返回true.

  • @Vijay Tholpadi - 这真的是一种编码偏好,而不是其他任何东西.在这个特定的例子中,后增量会完成相同的结果,但我总是使用预增量,除非有特殊原因不这样做. (2认同)

Gre*_*reg 114

您可以通过将字符串与其自身的反向进行比较来检查字符串是否为回文:

public static boolean isPalindrome(String str) {
    return str.equals(new StringBuilder(str).reverse().toString());
}
Run Code Online (Sandbox Code Playgroud)

或者对于早于1.5的Java版本,

public static boolean isPalindrome(String str) {
    return str.equals(new StringBuffer().append(str).reverse().toString());
}
Run Code Online (Sandbox Code Playgroud)

编辑: @FernandoPelliccioni 在时间和空间方面对该解决方案的效率(或缺乏效率)提供了非常全面的分析.如果您对此问题的计算复杂性以及此问题的其他可能解决方案感兴趣,请阅读它!

  • 比较算法的复杂性与其他算法的复杂程度. (10认同)
  • @FernandoPelliccioni,我认为它与其他解决方案一样复杂,不是吗? (2认同)

And*_*Mao 60

一个简洁的版本,不涉及(低效率)初始化一堆对象:

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;    
}
Run Code Online (Sandbox Code Playgroud)


Kei*_*OYS 17

或者,递归.

对于正在寻找更短的递归解决方案的任何人,检查给定的字符串是否满足作为回文:

private boolean isPalindrome(String s) {
    int length = s.length();

    if (length < 2) // If the string only has 1 char or is empty
        return true;
    else {
        // Check opposite ends of the string for equality
        if (s.charAt(0) != s.charAt(length - 1))
            return false;
        // Function call for string with the two ends snipped off
        else
            return isPalindrome(s.substring(1, length - 1));
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意:

private boolean isPalindrome(String s) {
    int length = s.length();
    if (length < 2) return true;
    return s.charAt(0) != s.charAt(length - 1) ? false :
            isPalindrome(s.substring(1, length - 1));
}
Run Code Online (Sandbox Code Playgroud)

  • 好的代码,递归使得它非常简单,代码上的线条更少. (3认同)
  • 较短的版本可以简化:`return s.charAt(0) == s.charAt(l - 1) &amp;&amp; isPalindrome(s.substring(1, l - 1));` (3认同)

Fra*_*rez 10

Go,Java:

public boolean isPalindrome (String word) {
    String myWord = word.replaceAll("\\s+","");
    String reverse = new StringBuffer(myWord).reverse().toString();
    return reverse.equalsIgnoreCase(myWord);
}

isPalindrome("Never Odd or Even"); // True
isPalindrome("Never Odd or Even1"); // False
Run Code Online (Sandbox Code Playgroud)