CodeGym /Java 博客 /随机的 /Java 程序检查一个字符串是否为回文
John Squirrels
第 41 级
San Francisco

Java 程序检查一个字符串是否为回文

已在 随机的 群组中发布
编程中的一些问题具有经典问题的地位。通常,此类任务与数学有关,他们非常喜欢询问计算机科学专业的学生,​​以及面试时的求职者。它们很好,因为它们有助于以程序员的方式很好地建立你的思维,并训练它。其中一个问题是检查字符串是否为回文,我们将在本文中考虑它。

什么是回文以及为什么能够找到它们

回文是一个数字、字母组合、单词或文本,在两个方向上读起来都一样。总而言之,回文可以称为任何关于其中心对称的字符集。这个词源自希腊词根,字面意思是“跑回去”(palin 是“再次,回来”,dromos 是“跑”)。回文在Java中的含义与一般含义相同。回文的例子:
  • 1881年
  • 啊啊啊啊
  • 流行音乐
  • 中午
  • 等级
  • 旋转器
  • 我的健身房
  • 女士我是亚当
  • 现在,先生,战争胜利了!
1881是回文数,其他都是回文串。在本文中,我们将研究表示为字符串的回文,但某些算法非常适用于 Java 中的其他类型的回文。你为什么要寻找回文?事实上,我们在日常生活中并不需要经常去寻找回文。这是一项非常具体的任务。如果我们回想一下字符串算法,在实践中更常见的是,程序员会发现搜索字符串中的子字符串,而不是搜索回文或它们的编号。然而,与回文相关的问题有重要的应用。首先是奥林匹克编程。可能有识别回文的任务。与新手程序员相关的第二个应用程序是面试。在一次技术面试中,你可能会被要求快速编写一个程序来检查一个字符串是否是回文,甚至可能是在一张纸上。好吧,在科学中,寻找回文最实际的应用是生物算法。根据维基百科,生物化合物的回文性对各种生物化合物的性质起着重要作用。

回文算法代码示例

让我们想想。字符串是一个字符序列,可以说是一个 char 数组。按照这个顺序从两边到中间比较极端的字符是最合乎逻辑的。如果直到我们到达中间,我们所有的字符都会匹配,那么我们就有了一个回文。让我们创建一个布尔方法 validPalindrome(String s) 来检查 String 是否为回文。Java代码在这里:

public class PalindromeTest1 {

//method to check if a string is palindrome    
public static boolean validPalindrome(String s) {
       for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
           if (s.charAt(i) != s.charAt(j)) {
               return false;
           }
       }
       return true;
   }

   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
       String s4 = "Now, sir, a war is won!"
       boolean b1 = validPalindrome(s1);
       boolean b2 = validPalindrome(s2);
       boolean b3 = validPalindrome(s3);
       boolean b4 = validPalindrome(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }

}
在 main 方法中,我们检查回文字符串“level”、“cool”、“Madam”和“Now, sir, a war is won!”。如您所见,第一个、第三个和第四个是回文,但第二个不是。该计划将提供什么?
水平是回文吗?true 是 cool 回文吗?false Madam 是回文吗?false is 现在,长官,战争胜利了!回文?错误的
所以,第一个是回文,第二个不是。然而,第三个和第四个有什么问题呢?为什么结果是假的?你可能已经猜到重点是这个字符串中的一些字符是大写的,一些是小写的,对于 Java M 和 m 是两个不同的字符。让我们改进程序以考虑到这种差异。这是一个检查字符串是否为回文的程序,可以解决大小写问题。

public class PalindromeTest2 {

   //lowercase and uppercase characters should be treated the same:
   public static boolean validPalindrome(String s) {
       for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
           if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
               return false;
       }
       return true;
   }

   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
        String s4 = "Now, sir, a war is won!"
       boolean b1 = validPalindrome(s1);
       boolean b2 = validPalindrome(s2);
       boolean b3 = validPalindrome(s3);
       boolean b4 = validPalindrome(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }

}
这次结果对我们来说更可预测:
水平是回文吗?true 是 cool 回文吗?false Madam 是回文吗?真的是现在,先生,战争胜利了!回文?错误的
好吧……不是完全可以预测的。“女士”的情况正在好转,但我们漫长而快乐的回文“现在,先生,战争胜利了!”。如果您还记得所有空格和标点符号都与 Java 的字母相同,则这很容易。所以我们需要再次改进我们的算法来纠正这个疏忽。让我们教我们的程序忽略空格和标点符号。简单地说,我们忽略所有非字母数字字符。这是Java中改进的回文程序。

public class PalindromeTest3 {

   //in addition to the above, ignore all non alphanumeric chars like punctuation and spaces
   private static boolean isAlphanumeric(char c) {
       return Character.isAlphabetic(c) || Character.isDigit(c);
   }

   public static boolean validPalindromeIgnorePunctuation(String s) {
       for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
           // skip chars we should ignore
           while (j >= 0 && !isAlphanumeric(s.charAt(j))) j--;
           while (i < s.length() && !isAlphanumeric(s.charAt(i))) i++;
           // overskipped -> nothing left to validate
           if (i >= j) return true;

           if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
               return false;
       }
       return true;
   }


   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
       String s4 = "Now, sir, a war is won!";
       boolean b1 = validPalindromeIgnorePunctuation(s1);
       boolean b2 = validPalindromeIgnorePunctuation(s2);
       boolean b3 = validPalindromeIgnorePunctuation(s3);
       boolean b4 = validPalindromeIgnorePunctuation(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }

}
至少结果是我们所期望的:
水平是回文吗?true 是 cool 回文吗?false Madam 是回文吗?真的是现在,先生,战争胜利了!回文?真的
也许,如果你刚刚开始编程,你很难理解字符串遍历和比较算法是如何工作的。当然,最好这样处理,但是你可以通过字符数组写一个简化版的段落,它实际上是一个字符串。您可以使用 StringBuffer.reverse 方法来检查字符串是否为回文。让我们做一个最简单的版本,不检查非字母数字符号和大小写。

public class PalindromeTest5 {

   public static boolean validPalindrome(String s) {

       StringBuffer buffer = new StringBuffer(s);
       buffer.reverse();
       String data = buffer.toString();

       if (s.equals(data)) {
           return true;
       }
       return false;
   }
   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
       String s4 = "Now, sir, a war is won!";
       boolean b1 = validPalindrome(s1);
       boolean b2 = validPalindrome(s2);
       boolean b3 = validPalindrome(s3);
       boolean b4 = validPalindrome(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }
}
结果与第一个示例相同
水平是回文吗?true 是 cool 回文吗?false Madam 是回文吗?false is 现在,长官,战争胜利了!回文?错误的
如果你愿意,你可以改进这个程序,就像我们对第一个例子所做的那样。 为了巩固您所学的知识,我们建议您观看我们的 Java 课程中的视频课程
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION