leetcode面试经典150题——25 验证回文串

题目:验证回文串

描述
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

示例 1:

输入: s = “A man, a plan, a canal: Panama”
输出:true
解释:“amanaplanacanalpanama” 是回文串。
leetcode链接

方法一:模拟
把删除修改后的字符串用另一个字符串进行存储,然后再判断是不是回文串
时间复杂度:o(n)
空间复杂度:o(n) n为字符串的长度,我们用到了新的字符串存储修改后的字符串

bool isPalindrome(string s) {
	string newStr;
	for(int i=0;i<s.size();i++){
		if(s[i]>='a'&&s[i]<='z'||s[i]>='0'&&s[i]<='9'){
			newStr+=s[i];
		}else if(s[i]>='A'&&s[i]<='Z'){
			newStr+=s[i]-'A'+'a';
		}
	}
	cout<<newStr;
	int first = 0,end = newStr.size()-1;
	while(first<end){
		if(newStr[first++]!=newStr[end--]){
			return false;
		}
	}
	return true;
}

方法二:
考虑对方法一进行优化,我们不用新的字符串存储改变后的字符串,而是直接在原字符串上进行判断,利用双指针发,定义left和right两个指针分别指向头尾,这两个指针会遇到这样的情况

  1. 两个指针所指向的元素都满足条件(即为小写字母或者数字)
  2. 两个指针有一个或多个为大写字母,把大写字母改为小写字母再进行比较
  3. 有一个或多个指针为不是大写字母的不满足条件的元素,不满足条件的指针移动,满足条件的指针不动,直达遇到满足条件的元素为止,再进行对比

时间复杂度:o(n) 空间复杂度:o(1) 没有申请额外的空间
补充:c++中判断一个字符为字母或者为数字的函数为isalnum()
是则返回true,否则返回false
c++中实现大小写转换的函数为tolower()/toupper()
前者为大写转小写,后者为小写转大写

 bool isPalindrome(string s) {
	int left = 0,right = s.size()-1;
	while(left<right){
		//遇到非法字符指针移动,知道找到合法字符为止 
		while(left<right&&!isalnum(s[left])){
			left++;
		}
		while(left<right&&!isalnum(s[right])){
			right--;
		}
		//如果遇到大写字母转小写字母,再进行判断 
		if(left<right&&tolower(s[left])!=tolower(s[right])){
			return false;
		}
		//比较完成之后记得要移动指针
		left++;
		right--;
	}
	return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值