Java如何检查一个字符串是否为回文字符串

22

我想检查一个字符串是否是回文。我想要学习一种简单的方法,使用最少的字符串操作来检查它。


1
https://dev59.com/MXVC5IYBdhLWcg3wliKe - Andy
1
@Andy:这是为了检测相同的效率。我希望用最简单的方式编写代码,使用最少的代码行和方法!! - Mithun Sasidharan
11个回答

122

使用reverse是过度的,因为您不需要生成额外的字符串,只需要查询现有的字符串。以下示例检查第一个和最后一个字符是否相同,并在向内部遍历字符串时每次检查结果。只要s不是回文,它就会返回。

reverse方法的问题在于它会一开始就做所有的工作。它对字符串执行一个昂贵的操作,然后逐个字符地检查,直到两个字符串不相等,仅当它不是回文时才返回false。如果您总是只比较小字符串,那么这样做没问题,但如果您想防范更大的输入,则应考虑使用此算法。

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

  return true;
}

6
可能是执行速度最快的解决方案。 - RokL
这个解决方案能否改为接受字符作为输入,而不是字符串?我正在寻找相同的回文解决方案,但是使用字符输入。另外,我可以问一下For循环是否确实检查了字符串的两半中的每个字符并进行比较吗?谢谢。 - user2971033
4
一个单独的字符总是一个回文。 - Joel Christophel
1
当字符串长度为奇数时,您无需比较中心字符。因此,您可以简单地使用以下代码: for (int i=0;i<(n / 2);++i) - Haider
它很快...但大多数人问这个问题是为了学习字符串和字符操作。如果不反转字符串就这样做...你学到的不多,只是逻辑。 - NightSkyCode
显示剩余7条评论

25

以最少的代码行数和最简单的情况为准

if(s.equals(new StringBuilder(s).reverse().toString())) // is a palindrome.

1
非常好,但去除空格可能更好:return str.replaceAll("\s", "").equals(new StringBuilder(str.replaceAll("\s", "")).reverse().toString())+""; - Beezer

12

这是一个简单的例子。

public class Palindrome {

    public static void main(String [] args){
        Palindrome pn = new Palindrome();

        if(pn.isPalindrome("ABBA")){
            System.out.println("Palindrome");
        } else {
            System.out.println("Not Palindrome");
        }   
    }

    public boolean isPalindrome(String original){
        int i = original.length()-1;
        int j=0;
        while(i > j) {
            if(original.charAt(i) != original.charAt(j)) {
                return false;
            }
            i--;
            j++;
        }
        return true;
    }
}

8
你可以尝试像这样的方法:
    String variable = ""; #write a string name

    StringBuffer rev = new StringBuffer(variable).reverse(); 

    String strRev = rev.toString(); 

    if(variable.equalsIgnoreCase(strRev)) # Check the condition

1
你也可以替换 ^[a-z],这样就可以处理像 "Madam, I'm Adam." 这样的回文字符串。 - Alex K.
@Alex K,如果您不担心大小写敏感性,那么您的句子就是回文。;-) - Buhake Sindi

7
这是一个好的类:
public class Palindrome {

  public static boolean isPalindrome(String stringToTest) {
    String workingCopy = removeJunk(stringToTest);
    String reversedCopy = reverse(workingCopy);

    return reversedCopy.equalsIgnoreCase(workingCopy);
  }

  protected static String removeJunk(String string) {
    int i, len = string.length();
    StringBuffer dest = new StringBuffer(len);
    char c;

    for (i = (len - 1); i >= 0; i--) {
      c = string.charAt(i);
      if (Character.isLetterOrDigit(c)) {
        dest.append(c);
      }
    }

    return dest.toString();
  }

  protected static String reverse(String string) {
    StringBuffer sb = new StringBuffer(string);

    return sb.reverse().toString();
  }

  public static void main(String[] args) {
    String string = "Madam, I'm Adam.";

    System.out.println();
    System.out.println("Testing whether the following "
        + "string is a palindrome:");
    System.out.println("    " + string);
    System.out.println();

    if (isPalindrome(string)) {
      System.out.println("It IS a palindrome!");
    } else {
      System.out.println("It is NOT a palindrome!");
    }
    System.out.println();
  }
}

享受吧。


public boolean isPalindrone(String checkPalindrome) { int length = checkPalindrome.length(); int mid = length / 2; int i, j = 0; for (i = 0, j = length - 1; i < mid; i++, j--) { if (checkPalindrome.charAt(i) != checkPalindrome.charAt(j)) break; } if (i == mid) return true; else return false; } - user358591

3
 public boolean isPalindrom(String text) {
    StringBuffer stringBuffer = new StringBuffer(text);
     return stringBuffer.reverse().toString().equals(text);
}

2
我猜这是检查回文的简单方法。
String strToRevrse = "MOM";

strToRevrse.equalsIgnoreCase(new StringBuilder(strToRevrse).reverse().toString());

1

我是Java的新手,我将您的问题视为提高自己知识的挑战,如果我的回答不够好,请见谅:

import java.util.ArrayList;
import java.util.List;

public class PalindromeRecursiveBoolean {

    public static boolean isPalindrome(String str) {

        str = str.toUpperCase();
        char[] strChars = str.toCharArray();

        List<Character> word = new ArrayList<>();
        for (char c : strChars) {
            word.add(c);
        }

        while (true) {
            if ((word.size() == 1) || (word.size() == 0)) {
                return true;
            }
            if (word.get(0) == word.get(word.size() - 1)) {
                word.remove(0);
                word.remove(word.size() - 1);
            } else {
                return false;

            }

        }
    }
}
  1. 如果字符串由没有字母或只有一个字母组成,则是回文。
  2. 否则,比较字符串的第一个和最后一个字母。
    • 如果第一个和最后一个字母不同,则该字符串不是回文
    • 否则,第一个和最后一个字母相同。从字符串中去掉它们,并确定剩下的字符串是否是回文。将这个较小字符串的答案作为原始字符串的答案,然后从1重复。

唯一的字符串操作是将字符串转换为大写形式,以便您可以输入类似于“XScsX”的内容


0

检查这个条件

字符串 string = "//一些字符串...//"

检查这个... 如果(string.equals((string.reverse())) { 它是回文 }


String类没有reverse方法。 - Michael Myers

0
import java.util.Scanner;

public class FindAllPalindromes {
static String longestPalindrome;
public String oldPalindrome="";
static int longest;

public void allSubstrings(String s){        
    for(int i=0;i<s.length();i++){
        for(int j=1;j<=s.length()-i;j++){
            String subString=s.substring(i, i+j);  
            palindrome(subString);             
        }
    }
        }   
public void palindrome(String sub){
    System.out.println("String to b checked is "+sub);
    StringBuilder sb=new StringBuilder();
    sb.append(sub);     // append string to string builder 
    sb.reverse();        
    if(sub.equals(sb.toString())){                        // palindrome condition 
        System.out.println("the given String :"+sub+" is a palindrome");
        longestPalindrome(sub);
    }
    else{
        System.out.println("the string "+sub+"iss not a palindrome");
    }
        }
public void longestPalindrome(String s){
            if(s.length()>longest){                 
        longest=s.length();
        longestPalindrome=s;

    }
    else if (s.length()==longest){    
        oldPalindrome=longestPalindrome;
        longestPalindrome=s;

    }




}

public static void main(String[] args) {
FindAllPalindromes fp=new FindAllPalindromes();

    Scanner sc=new Scanner(System.in);    
    System.out.println("Enter the String ::");
    String s=sc.nextLine(); 
    fp.allSubstrings(s);      
    sc.close();
    if(fp.oldPalindrome.length()>0){
    System.out.println(longestPalindrome+"and"+fp.oldPalindrome+":is the longest palindrome");  
    }
    else{
        System.out.println(longestPalindrome+":is the longest palindrome`````");
    }}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接