给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
整体思路:
双指针解法,自身还是对于字符串还是更喜欢采用指针解法,感觉指针都是对于字符串的通用解法。
(1)先把字符串中的数字和字母提取出来,大小写全转为小写,用到isalnum函数和tolower函数
isalnum(s[i])函数:判断函数,判断s[i]是否为字母或数字,是则返回非0
tolower函数:将大写的英文字母转换为小写,只对英文字母起作用
(2)新的字符串包含原来的字母和数字,不包含空格标点符号
(3)左右两指针移动判断是否相等
代码题解:
class Solution {
public:
bool isPalindrome(string s) {
int n=s.size();
if(n==0)
return true;
string res;
for(int i=0;i<n;i++)
{
if((s[i]>='a'&&s[i]<='z')||(s[i]>='0'&&s[i]<='9'))
res=res+s[i];
else if(s[i]>='A'&&s[i]<='Z')
{
s[i]=s[i]+32;
res=res+s[i];
}
else
continue;
}
string res1=res;
std::reverse(res1.begin(),res1.end());
if(res1==res)
return true;
return false;
}
};
这个代码字符串存储过大,超出时间限制,但我感觉这个很好理解!算了,弃用!!
上正确代码(官方代码经改动)
class Solution {
public:
bool isPalindrome(string s) {
int n=s.size();
string str;
for(int i=0;i<n;i++)
{
if(isalnum(s[i]))
str+=tolower(s[i]);
}
int m=str.size();
int left=0;
int right=m-1;
while(left<right)
{
if(str[left]!=str[right])
return false;
left++;
right--;
}
return true;
}
};
刷了几天的题了,这是我感觉官方给的最简单的代码,一看就懂很好理解!
所有代码均未优化,仅供思路参考。