- 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
补充:C语言版本
bool isNum(char c) {
if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
return true;
}
return false;
}
char toUpper(char c) {
if (c >= 'a' && c <= 'z') {
return c - 'a' + 'A';
}
return c;
}
bool isPalindrome(char * s){
int len = strlen(s);
int i = 0, j = len - 1;
while (i < j) {
if (!isNum(s[i])) {
i++;
continue;
}
if (!isNum(s[j])) {
j--;
continue;
}
if (toUpper(s[i]) != toUpper(s[j])) {
return false;
}
i++;
j--;
}
return true;
}
/*4ms,5.9MB*/
思路一:
创建一个新的字符串,只包含原字符串中的字母和数字字符,然后镜像对比
class Solution {
public:
bool isPalindrome(string s) {
int len = s.length();
string temp = "";
//删除非字母和数字字符,将小写字母转为大写
for (int i=0; i<len; i++){
if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= '0' && s[i] <= '9')){
temp += s[i];
} else if (s[i] >= 'a' && s[i] <= 'z'){
temp += s[i] - 'a' + 'A';
}
}
//镜像比较
int len = temp.length();
for (int k=0; k<len/2; k++){
if (temp[k] != temp[len-1-k]){
return false;
}
}
return true;
}
};
可以利用isalnum函数排除非字母数字,lower/tolower将所有字母转为小写,然后镜像对比处理后的字符串,代码会更精简
class Solution {
public:
bool isPalindrome(string s) {
string temp = "";
//删除非字母和数字字符,将小写字母转为大写
for (auto c : s){
if (isalnum(c)){
temp += tolower(c);
}
}
//镜像比较字符串
int len = temp.length();
for (int k=0; k<len/2; k++){
if (temp[k] != temp[len-1-k]){
return false;
}
}
return true;
}
};
/*12ms,9.8MB*/
复杂度分析:
时间复杂度:O(n),两次循环1.5n
空间复杂度:O(n),新增字符串最大长度灯源原字符串的长度
思路二:在原有字符串基础上,边判断是否是字母或数字字符,边镜像对比
class Solution {
public:
bool isPalindrome(string s) {
int len = s.length();
int i = 0, j = len -1;
while (i < j){
if (!isalnum(s[i])){
i++;
continue;
}
if (!isalnum(s[j])){
j--;
continue;
}
if (s[i] != s[j]){
if (isdigit(s[i]) || isdigit(s[i]){
return false;
}
if (abs(s[i] - s[j]) != 32){
return false;
}
}
i++;
j--;
}
return true;
}
};
/*8ms,9.5MB*/
class Solution {
public:
bool isPalindrome(string s) {
int i = 0, j = s.length() -1;
while (i < j){
if (!isalnum(s[i])){
i++;
continue;
}
if (!isalnum(s[j])){
j--;
continue;
}
//这样写更精简了,谁知道效率还低了4ms
if (tolower(s[i]) != tolower(s[j])){
return false;
}
i++;
j--;
}
return true;
}
};
/*12ms,9.5MB*/
复杂度分析:
时间复杂度:O(n),两次循环0.5n
空间复杂度:O(1),基本没有新增变量