23.LeetCode之验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值