题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例:
输入: "A man, a plan, a canal: Panama"
输出: true
输入: "race a car"
输出: false
题目链接: https://leetcode-cn.com/problems/valid-palindrome/
思路
首先清理输入的字符串:只保留字母和数字,并且将字母全部转为小写。然后判断清理后的字符串是否为回文串:
- 设置两个指针 left=0,right=newStr.length()-1,left 和 right 由两边向中间靠拢;
- 当 left<=right,循环:
- 如果 newStr[left]!=newStr[right],返回 false;
- 返回 true;
代码如下:
class Solution {
public:
bool isPalindrome(string s) {
if(s.empty()) return true;
string newStr = "";
for(int i=0; i<s.length(); i++){
if(isalpha(s[i])){
newStr += tolower(s[i]);
}else if(isdigit(s[i])){
newStr += tolower(s[i]);
}
}
int left = 0, right = newStr.length()-1;
while(left<=right){
if(tolower(newStr[left])!=tolower(newStr[right])) return false;
left++;
right--;
}
return true;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)