题目链接:https://leetcode.cn/problems/valid-palindrome/
一:直接法。
利用用isalnum()判断是否为数字和字母
s1为s去除非字母数字项并且字母转换为大写的字符串,s2为s1的翻转字符串,两者直接比较就行。
bool isPalindrome(string s) {
string s1;
for (auto i = 0; i <s.size(); i++) {
if (isalnum(s[i])) {
s1+=toupper(s[i]);
}
}
string s2(s1.rbegin(), s1.rend());
if (s1 != s2) {
return false;
}
return true;
}
二:双指针
直接在原指针上进行操作,左右指针left,right分别从字符串最左最右边开始互相接近,越过非字母数字的项,进行比较。
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);
}
}
int n = sgood.size();
int left = 0, right = n - 1;
while (left < right) {
if (sgood[left] != sgood[right]) {
return false;
}
++left;
--right;
}
return true;
}
};
三:知识总结
1.isalnum()
isalnum()
是一个字符处理函数,用于判断一个字符是否为字母(a - z
、A - Z
)或者数字(0 - 9
)
2.string 中的 + 是直接拼接
3.翻转string
string s1(s.rbegin(),s.rend()),s1为s翻转后的字符串,这么做更加简单
当然也可以用reverse(),不过要注意该函数的返回值是迭代器类型,不能直接把返回值赋给字符串,只能翻转字符串。
reverse(str.begin(), str.end());