原题:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
解法1:
思路:先去除标点符号,以及空格,把字符串都变成小写,因为后面需要字符串前后对比;转换成字符数组,首尾开始往中间依次对比,相同则是回文。
class Solution {
public boolean isPalindrome(String s) {
s=s.replaceAll("[\\pP\\p{Punct}]" , "");
s=s.replaceAll(" +" , "");
s=s.toLowerCase();
char[] array=s.toCharArray();
int n=array.length;
for(int i=0;i<n/2;i++){
if(array[i]!=array[n-1-i]){
return false;
}
}
return true;
}
}
解法2:
思路:这题的重点就是去除这些标点符号的干扰,下面这个算法就是写一个函数判断是否为数字或字母,在前后对比时,先判断是否为数字或字母,是就舍弃移位。这样做就省去了对字符串的各种操作了。
class Solution {
public:
bool isPalindrome(string s) {
int left = 0, right = s.size() - 1 ;
while (left < right) {
if (!isAlphaNum(s[left])) ++left;
else if (!isAlphaNum(s[right])) --right;
else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32) return false;
else {
left++;
right--;
}
}
return true;
}
bool isAlphaNum(char &c) {
if (c >= 'a' && c <= 'z') return true;
if (c >= 'A' && c <= 'Z') return true;
if (c >= '0' && c <= '9') return true;
return false;
}
};
BB一句:
注意:
1 、s=s.replaceAll("[\pP\p{Punct}]" , ""); 去除标点作用