给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
C代码①:修改原字符串(大写字母变小写字母)
bool isPalindrome(char* s) {
int length = strlen(s);
int left=0, right=length-1;
if( length == 0 )
return true;
while( left < right )
{
if( s[left]>='A' && s[left]<='Z' ) //通过ASCII码值,将大写字母转化成小写字母
s[left] += 32;
if( (s[left]<'a'||s[left]>'z') && (s[left]<'0'||s[left]>'9') ) //跳过除字母和数字外的其他字符
{
left++;
continue;
}
if( s[right]>='A' && s[right]<='Z' )
s[right] += 32;
if( (s[right]<'a'||s[right]>'z') && (s[right]<'0'||s[right]>'9') )
{
right--;
continue;
}
if( s[left] != s[right] ) //比较对应位置的字符
return false;
left++, right--;
}
return true; //跳出while循环,则left>=right,说明是回文串
}
C代码②:不修改原字符串(在比较算法上进行同一个字母的大小写匹配)
bool isPalindrome(char* s) {
int length = strlen(s);
int left=0, right=length-1;
if( length == 0 )
return true;
while(1)
{
//跳过除字母和数字外的其他字符
while( !( (s[left]>='A'&&s[left]<='Z') || (s[left]>='a'&&s[left]<='z') || (s[left]>='0'&&s[left]<='9') ) )
{
left++;
if( left >= right )
return true;
}
while( !( (s[right]>='A'&&s[right]<='Z') || (s[right]>='a'&&s[right]<='z') || (s[right]>='0'&&s[right]<='9') ) )
{
right--;
if( left >= right )
return true;
}
if( s[left]>='A' && s[right]>='A') //字母判别
{
if( !(s[left]==s[right] || s[left]-s[right]==32 || s[right]-s[left]==32) ) //满足一个字母的大小写匹配
return false;
}
else if( s[left]<='9' && s[right]<='9' ) //数字判别
{
if( s[left] != s[right] )
return false;
}
else //针对包含数字和字母的非回串,如"0P"
return false;
left++, right--; //left,right对称移动
}
}
注意:以上的回文串判断算法是在存在其余无关字符的情况下,通过跳过其余字符后,在对数字和字母进行回文匹配。
若不存在无关字符,仅是对连续纯字母串进行匹配,则更加简单,可参考以下代码
C代码:
bool palindrome(char *s){
char *a = s; //定义一个新指针指向s
int i = 0,j=0,k=0;
while (*a != '\0'){ //统计字符串位数
a++;
i++;
}
a--; //a为字符串最后一位'\0'的地址,所以减一位后为所输入字符串的最后一位
while (*s != '\0'){ //进行两个比较
if (*s == *a){
k++;
}
else{
return false;//在遍历过程中有对应不相等的项,直接返回false
}
s++;//指针s正向遍历与a进行比较
a--;//指针a反向遍历与s进行比较
}
if (k == i){ //如果k与i相等则说明在遍历过程中字符串正向与反向对应相等,返回true
return true;
}
}
对回文数的判断,可参考LeetCode之回文数,链接:https://blog.youkuaiyun.com/qq_39564672/article/details/87988067