1、描述
125给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
回文串
3、思路
1、遍历逆置
2、双指针原地转
4、notes
1、字符串的API调用
https://blog.csdn.net/Tlwhisper/article/details/106862259
isalnum(ch) // 判断是否是数字和大小写字母,如果是返回1
tolower(ch); // 如果是大写字母就变成小写字母,如果不是,无变化
if(str1==str2); // 字符串直接用等号比较
str1+=ch; // 字符串可以直接累加字母放到后边
**逆置构造字符串用小括号,不能用等号**
string sReverse(s_good.rbegin(),s_good.rend());
5、复杂度
**逆置: **
时间:O(n)
空间:O(n)
原地双指针
时间:O(n)
空间:O(1)
6、code
逆置
class Solution {
public:
bool isPalindrome(string s) {
string s_good;
for(auto ch : s)
{
//if(ch.isalnum())
if(isalnum(ch))
//s_good += tolower(ch);
s_good += toupper(ch);
}
// string sReverse=(s_good.rbegin(),s_good.rend());// 这种方式就错误
string sReverse(s_good.rbegin(),s_good.rend());
if(s_good==sReverse) return true;
else
return false;
}
};
两头双向比较
class Solution {
public:
bool isPalindrome(string s) {
int n=s.length();
int left=0,right=n-1;
while(left<right)
{
while(left<right && !isalnum(s[left])) //左边不是字母,且左小右大
{
left++;
}
while(left<right && !isalnum(s[right])) // 右边不是字母,且左小右大
{
right--;
}
if(toupper(s[left])!=toupper(s[right]))
{
return false;
}
left++; // 相等情况
right--;
}
return true;
}
};