如何在Java中获取字符串的回文

Posted

技术标签:

【中文标题】如何在Java中获取字符串的回文【英文标题】:How to get the palindrome of a string in Java 【发布时间】:2016-06-27 12:07:01 【问题描述】:

好的。我知道还有其他几个很好的程序可以检查字符串是否为回文。 但我正在尝试这段代码。问题是,由于我正在逐个字符检查,每次字符匹配时都会打印出回文

但我只想打印一次回文

那么有没有办法让我完全遍历循环然后执行打印语句?

import java.util.Scanner;
public class Solution
public static void main(String[] args)
    Scanner scan = new Scanner(System.in);
    String A = scan.next();

    for(int i =0;i<(A.length()/2);i++)
    
        if(A.charAt(i)==A.charAt(A.length()-i-1))
            System.out.println("palindrome");
        else
            System.out.println("not palindrome");

    
  

【问题讨论】:

【参考方案1】:

我会保留一个boolean 标志(默认为true),如果不是,则设置为false。然后在循环后检查你的标志。类似的,

boolean palindrome = true;
for(int i = 0; i < (A.length() / 2); i++)

    if (A.charAt(i) != A.charAt(A.length() - i - 1)) 
        palindrome = false;
        break;
    

if (palindrome) 
     System.out.println("palindrome");
 else 
    System.out.println("not palindrome");

你可以用ternary(或条件运算符? :)来写最后一部分

System.out.println(palindrome ? "palindrome" : "not palindrome");

而且,您可以替换循环为StringBuilder.reverse() like

boolean palindrome = new StringBuilder(A).reverse().toString().equals(A);

所以,它可能是像一个班轮一样

System.out.println(new StringBuilder(A).reverse().toString().equals(A) 
       ? "palindrome" : "not palindrome");

【讨论】:

存在错误。但我喜欢短的单衬里。这将说“a”是回文。此外,它会将“转子”称为非回文。 考虑修改 System.out.println(new StringBuilder(A.toLowerCase()).reverse().toString().equals(A.toLowerCase()) && A.length() > 2 ? A + " 是回文" : A + " 不是回文");【参考方案2】:

你应该跟踪字符串是否仍然有效,例如:

boolean palin = true;
for(int i =0 ; i < A.length()/2 ; i++) 
    if(A.charAt(i)!=A.charAt(A.length()-i-1)) 
        palin = false;
        break;
    


if(palin) System.out.println("Is Palindrome");
else System.out.println("Is Not a Palindrome");

【讨论】:

【参考方案3】:

在您的代码中,您检查前半部分字符和后半部分字符,并在每个字符上打印palindrome/not palindrome

相反,您应该遍历整个字符串,确定整个字符串是否是回文,然后在最后打印一次。

这是修复代码的简单方法:

// At the start, we assume the string is a palindrome.
boolean palin = true;

// We loop through the characters, looking for evidence to contradict our
// assumption. Once palin becomes false, it can never become true again.
for(int i =0;i<(A.length()/2);i++)

    if(A.charAt(i)!=A.charAt(A.length()-i-1))
        palin = false;


// Now the Boolean variable tells us the answer we want.
if (palin) System.out.println("palindrome");
else System.out.println("not palindrome");

【讨论】:

如果palin = false,你应该尽早中断,以避免进一步检查字符串是否很长,这样可以节省大量时间。 我们不要用新概念压倒 OP,好吗? 是的..我知道。这就是我要问的。因为我不想遍历整个字符串。我正在逐个字符地检查。 我不确定我是否会使用 palin 作为变量名。你们真是特立独行。 您是否考虑改用drome【参考方案4】:

我喜欢上面给出的所有回复。但是,我认为您的代码将存在以下问题: 1. 它将单个字符视为回文。 2.它不会将Rotor和rotoR识别为回文。

我还为您添加了代码,以根据您的文件对您的方法进行基准测试。我认为这是非常昂贵的。所以重新考虑使用更好的算法。

package algorithms;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;

public class PalindromeAnalysis 

public static void main(String[] args) 
    Path p1 = Paths.get("/Users/droy/var/palindrome.txt");

    Scanner scan = null;
    try 
        scan = new Scanner(p1);
     catch (IOException e) 
        e.printStackTrace();
     

    long st1 = System.currentTimeMillis();
    while (scan.hasNext())
        String A = scan.next();
        boolean isPalindrome = true;
        try 
                if (A.length() <= 2) throw new Exception("Is not a Palindrome");

                for(int i =0; i<(A.length()/2);i++)
                 
                    if (A.toUpperCase().charAt(i) != A.toUpperCase().charAt(A.length()-i-1))
                        throw new Exception("Is not a Palindrome");
                    
                
        
        catch (Exception e) 
            isPalindrome = false;
        

        if (isPalindrome)
            System.out.println("This is Palindrome : " + A);
        
        else 
            System.out.println("This is not Palindrome" + A);
        
    

    long et1 = System.currentTimeMillis();
    System.out.println("Time it took was:" + (et1 - st1) + " ms");


【讨论】:

以上是关于如何在Java中获取字符串的回文的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是是回文的字谜

如何有效地确定给定字符串中最长的单个字符回文?

如果没有输入,如何退出代码?代码示例:检查字符串是不是为回文? (在 C 编程语言中)

如何计算将字符串转换为回文所需的字符数?

如何检查一个数字是不是是回文?

如何计算最小编号。将字符串转换为回文的替换?