《LeetCode之每日一题》:132.验证回文串
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:132.验证回文串相关的知识,希望对你有一定的参考价值。
题目链接: 验证回文串
有关题目
给定一个字符串,验证它是否是回文串,
只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 10^5
字符串 s 由 ASCII 字符组成
题解
Tips
tolower()把字符转换成小写字母,非字母字符不做出处理
法一:筛选 + 判断
代码一:使用字符串翻转 API
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (auto &ch : s){
if (isalnum(ch)){
sgood += tolower(ch);
}
}
string sgood_rev(sgood.rbegin(), sgood.rend());
return sgood == sgood_rev;
}
};
时间复杂度:O(N)
空间复杂度:O(N)
代码二:双指针
class Solution {
public:
bool isPalindrome(string s) {
int n = s.size();
string sgood;
for (auto& ch : s){
if (isalnum(ch)){
sgood += tolower(ch);
}
}
int l = 0, r = sgood.size() - 1;//注意验证的回文串为sgood
while(l < r){
if (sgood[l] != sgood[r]){
return false;
}
++l, --r;
}
return true;
}
};
时间复杂度:O(N)
空间复杂度:O(N)
法二:在原字符串上直接判断
代码一:
class Solution {
public:
bool isPalindrome(string s) {
int n = s.size();
if (n == 0){
return true;
}
for (int l = 0, r = n - 1; l < r;){
while (l < n && !isdigit(s[l]) && !isalpha(s[l])){
l++;
}
while(r >= 0 && !isdigit(s[r]) && !isalpha(s[r])){
r--;
}
if (l == n || r < 0){//全串为非字母,非数字
return true;
}
else if (isdigit(s[l]) && isdigit(s[r]) && s[l] == s[r]){
++l, --r;
}
else if (isalpha(s[l]) && isalpha(s[r]) && tolower(s[l]) == tolower(s[r])){
++l, --r;
}
else{
return false;
}
}
return true;
}
};
时间复杂度:O(N)
空间复杂度:O(1)
代码二:
class Solution {
public:
bool isPalindrome(string s) {
int n = s.size();
if (n == 0){
return true;
}
int l = 0, r = n - 1;
while(l < r){
while(l < r && !isalnum(s[l])){
++l;
}
while(l < r && !isalnum(s[r])){
--r;
}
if (l < r){
if (tolower(s[l]) != tolower(s[r])){
return false;
}
++l;
--r;
}
}
return true;
}
};
时间复杂度:O(N)
空间复杂度:O(1)
以上是关于《LeetCode之每日一题》:132.验证回文串的主要内容,如果未能解决你的问题,请参考以下文章