2022.7.21今天你刷题了吗?
题目:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
分析:
给定一个包括数字,字母,其他符号的字符串,现在判断该字符串是不是回文串,也就是正序和逆序的输出一样。
思路:我们只保留字符串的数字和字母,然后把字符串逆序,判断逆序和正序是否一样即可。
解析:
1.排序
class Solution {
public:
bool isPalindrome(string s) {
string ans;
string res;
//把s的数字和字母按小写插入ans中
for (auto ch : s)
{
if (isalnum(ch))
{
ans += tolower(ch);
}
}
res = ans;
//现在判断ans是不是回文,利用逆序判断是否相等
reverse(ans.begin(),ans.end());
return res == ans;
}
};
2.双指针
通过两个指针从前后分别开始遍历,指针停止条件为left<right和当前元素为字符串和数字。当判断左右指针元素满足条件,此时判断元素内容是否一样。
class Solution {
public:
bool isPalindrome(string s) {
int left = 0;
int right = s.size() - 1;
while (left < right)
{
//一直移到字母或者数字
while (left < right && !isalnum(s[left]))
{
++left;
}
while (left < right && !isalnum(s[right]))
{
--right;
}
//当此时是数字或者字母时
if (left < right)
{
if (tolower(s[left]) != tolower(s[right]))
{
return false;
}
++left;
--right;
}
}
return true;
}
};