leetcode刷题日记——验证回文串
[ 题目描述 ]:
[ 思路 ]:
- 题目要求验证一个字符串中所有的字母或数字组成的字符串是否为回文串,即反过来和原本一样
- 首先需要提取出所有的英文字母,并将其全部转换为小写( 由于转换大写比较方便,所以采用了转为大写)
- 定义双指针,从头尾两端进行匹配
- 全部相同则为回文串
- 否则不是
- 运行如下
bool isPalindrome(char* s) {
int head=0,rear,len=strlen(s),index=0;
char* temp=(char*)malloc(sizeof(char)*(len+1));
for(int i=0;i<len;i++){
if((s[i]>=65 && s[i]<=90) || (s[i]>=97 && s[i]<=122) ||(s[i]>=48 && s[i]<=57)){
temp[index++]= s[i]>=97 ? s[i]-32 : s[i];
}
}
temp[index]='\0';
rear=index-1;
while(head<rear){
if(temp[head++]!=temp[rear--]){
free(temp);
return false;
}
}
free(temp);
return true;
}
- 时间复杂度O(n),空间复杂度O(n)
[ 优化 ]:
- 如果直接在原字符上操作,就可以不用申请额外的空间
- 那么只需要,首指针或尾指针在不是字母或者数字时,跳到下一个字符
- 当首尾指针均为字母或数字时,进行比较
- 如果不相同,则直接返回false
- 运行如下
char lower(char s){
return (s>=65 && s<=90) ? s+32:s;
}
bool isPalindrome(char* s) {
int head=0,rear=strlen(s)-1;
while(head<rear){
while(head < rear && !((s[head]>=65 && s[head]<=90) || (s[head]>=97 && s[head]<=122) ||(s[head]>=48 && s[head]<=57))) {
head++;
}
while(head < rear && !((s[rear]>=65 && s[rear]<=90) || (s[rear]>=97 && s[rear]<=122) ||(s[rear]>=48 && s[rear]<=57))){
rear--;
}
if(lower(s[head])!=lower(s[rear])) return false;
head++;
rear--;
}
return true;
}
[ 官方题解 ]:
- 一、筛选+判断,即第一段代码的思想
- 二、在原字符串上直接判断,即优化部分的代码