(125)验证回文段
Description:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
**说明:**本题中,我们将空字符串定义为有效的回文串。
示例1:
输入: "A man, a plan, a canal: Panama" 输出: true
示例2:
输入: "race a car" 输出: false
思路:
其实整体思路也是首先将str过滤为只含有数字和字母,再将其全部大写/小写。最后检验其是否为回文段。
对于字符串过滤,目前想到三种方法:
-
使用filter来过滤无效字符,
但没搞清楚如何既保留字母也保留数字只需要使用str.isalnum。(需要注意的是,filter所返回的是一个generator,即惰性迭代对象,需要使用*list()*来将其转化为list,再使用str.join()来append再string的后面) -
最无脑的方法,遍历string,将符合要求的append在某空string上。
-
使用re.findall()来过滤。需要复习正则表达式
-
如果使用C的话,使用stack
-
使用双指针夹逼
代码:
- 使用*re.findall()*来进行过滤操作:
#44ms
class Solution:
def isPalindrome(self, s: str) -> bool:
import re
s = ''.join(re.findall("(\w+)", s)).lower()
return s == s[::-1]
- 利用filter来进行过滤:
#28ms
class Solution:
def isPalindrome(self, s: str) -> bool:
s = ''.join(list(filter(str.isalnum,s))).lower()
return s == s[::-1]
- C语言利用stack进行判断:(粘贴了别人的代码)
bool isPalindrome(char * s){
if(s == "")
return 1;
int len = strlen(s);
char *stk = (char*)malloc(sizeof(char) * len);
int top = -1, i;
for(i = 0; i < len; i++){
if(isupper(s[i])){
stk[++top] = s[i] + 32;
}
else if(islower(s[i]) || isdigit(s[i])){
stk[++top] = s[i];
}
}
for(i = 0; i < len; i++){
if(isupper(s[i])){
char t = stk[top];
if(s[i] + 32 != t)
return 0;
top--;
}
else if(islower(s[i]) || isdigit(s[i])){
char t = stk[top];
if(s[i] != t)
return 0;
top--;
}
}
if(top >= 0)
return 0;
return 1;
}
/*
作者:zed-65536
链接:https://leetcode-cn.com/problems/valid-palindrome/solution/yan-zheng-hui-wen-chuan-c-by-zed-65536/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
- 双指针速攻:(不是很快诶)
# 60ms 不是很快
class Solution:
def isPalindrome(self, s: str) -> bool:
i, j = 0, len(s) - 1
while i < j:
while i < len(s) and not s[i].isalnum():
i += 1
while j > -1 and not s[j].isalnum():
j -= 1
if i > j:
return True
if s[i].lower() != s[j].lower():
return False
else:
i = i + 1
j = j - 1
return True