给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
代码
bool isPalindrome(char * s){
if (NULL == s) {
return false;
}
int str_len = strlen(s)+1;
//printf("s: %s, str_len :%d\n", s, str_len);
char * new_s = (char *) malloc (str_len);
int i = 0, j = 0, k = 0;
/*1、将原始字符串的非字母和数字剔除*/
for(i = 0; i < str_len; i++){
if ( *(s+i) >= 'a' && *(s+i) <= 'z') {
new_s[j] = *(s+i) - 32;
} else if(*(s+i) >= 'A' && *(s+i) <= 'Z') {
new_s[j] = *(s+i);
} else if (*(s+i) >= '0' && *(s+i) <= '9') {
new_s[j]= *(s+i);
} else {
continue;
}
//printf("j:%d, %c\n", j, new_s[j]);
j++;
}
//printf("new_s : %s\n", new_s);
k = j-1;
/*2、两个指针从新字符串的两头往中间逐个对比*/
for ( i = 0; i < j && i < k; i++) {
if(*(new_s+i) == *(new_s+k)){
;
}else{
return false;
}
k--;
}
return true;
}
python 代码如下
class Solution:
def isPalindrome(self, s: str) -> bool:
left, right = 0, len(s)-1
while left < right:
#isalnum()判断是否是数字或字母
while left < right and not s[left].isalnum():
left += 1
while left < right and not s[right].isalnum():
right -= 1
if s[left].lower() != s[right].lower():
return False
left += 1; right -= 1
return True
solution = Solution()
solution.isPalindrome("Abc Ba")