编程中的一些问题具有经典问题的地位。通常,此类任务与数学有关,他们非常喜欢询问计算机科学专业的学生,以及面试时的求职者。它们很好,因为它们有助于以程序员的方式很好地建立你的思维,并训练它。其中一个问题是检查字符串是否为回文,我们将在本文中考虑它。
什么是回文以及为什么能够找到它们
回文是一个数字、字母组合、单词或文本,在两个方向上读起来都一样。总而言之,回文可以称为任何关于其中心对称的字符集。这个词源自希腊词根,字面意思是“跑回去”(palin 是“再次,回来”,dromos 是“跑”)。回文在Java中的含义与一般含义相同。回文的例子:- 1881年
- 啊啊啊啊
- 流行音乐
- 中午
- 等级
- 旋转器
- 我的健身房
- 女士我是亚当
- 现在,先生,战争胜利了!
回文算法代码示例
让我们想想。字符串是一个字符序列,可以说是一个 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 课程中的视频课程
GO TO FULL VERSION