1、题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
2、示例
输入: "A man, a plan, a canal: Panama"
输出: true
3、题解
解法一:
基本思想:递归,左右下标所指字符都转为小写字符比较是否相等,如果不相等返回false(数字字符转为小写字符对应ascll码是本身不变),否则left++right--继续比较下一对字符
解法二:
基本思想:迭代,左右下标所指字符都转为小写字符比较是否相等,如果不相等返回false(数字字符转为小写字符对应ascll码是本身不变),否则left++right--继续比较下一对字符
#include<iostream>
#include<vector>
#include<cctype>
#include<algorithm>
using namespace std;
class Solution {
public:
bool isPalindrome(string s) {
//基本思想:递归,左右下标所指字符都转为小写字符比较是否相等,如果不相等返回false,否则left++right--继续比较下一对字符
return Recursion(s, 0, s.size() - 1);
}
bool Recursion(string& s, int left, int right)
{
//递归终止条件
if (left == right || left > right)
return true;
if (!isalnum(s[left]))
return Recursion(s, left + 1, right);
if (!isalnum(s[right]))
return Recursion(s, left, right - 1);
if (tolower(s[left]) != tolower(s[right]))
return false;
else
return Recursion(s, left + 1, right - 1);
}
};
class Solution1 {
public:
bool isPalindrome(string s) {
//基本思想:迭代,左右下标所指字符都转为小写字符比较是否相等,如果不相等返回false,否则left++right--继续比较下一对字符
int left = 0, right = s.size() - 1;
while (left < right)
{
if (!isalnum(s[left]))
{
left++;
continue;
}
if (!isalnum(s[right]))
{
right--;
continue;
}
if (tolower(s[left]) != tolower(s[right]))
return false;
left++;
right--;
}
return true;
}
};
int main()
{
Solution solute;
string s = "A man, a plan, a canal: Panama";
cout << solute.isPalindrome(s) << endl;
return 0;
}