在这篇文章中,我们将解析力扣经典150题中的第二十五题:验证回文串。给定一个字符串 s,如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,该字符串正着读和反着读都一样,则认为它是一个回文串。
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。示例 2:
输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。示例 3:
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。我们可以使用双指针的方法来解决这个问题:
s 转换为小写字母。false,否则直到两个指针相遇时都没有找到不同的字符,则返回 true。public class Solution {
public boolean isPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
while (left < right) {
while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
left++;
}
while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
right--;
}
char leftChar = Character.toLowerCase(s.charAt(left));
char rightChar = Character.toLowerCase(s.charAt(right));
if (leftChar != rightChar) {
return false;
}
left++;
right--;
}
return true;
}
}s 的长度。双指针遍历一次字符串。我们对示例输入进行测试:
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
String s1 = "A man, a plan, a canal: Panama";
System.out.println("是否是回文串:" + solution.isPalindrome(s1)); // 输出 true
String s2 = "race a car";
System.out.println("是否是回文串:" + solution.isPalindrome(s2)); // 输出 false
String s3 = " ";
System.out.println("是否是回文串:" + solution.isPalindrome(s3)); // 输出 true
}
}通过使用双指针遍历字符串并比较字符,我们可以有效地判断一个字符串是否是回文串。在遍历过程中,跳过非字母数字字符,只比较字母数字字符的小写形式是否相同。
我们可以探讨一些扩展话题,例如使用其他方法(如正则表达式)来解决字符串处理的问题,或者讨论特殊情况和边界条件下的处理方式。
希望本文能够帮助读者理解回文串的概念及其判断方法。