题目:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true
示例 2:
输入: "race a car" 输出: false
解题思路:
先处理字符串:变为小写,取出其中的数字和字母
验证是否为回文:双“指针”,前后相互比对,碰头时停止!
Python解答:
代码:
class Solution:
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
if s=="":
return True
s=s.lower()
len_s=len(s)
s1=[]
for i in range(0,len_s):
if s[i].isalpha() or s[i].isdigit():
s1.append(s[i])
j=len(s1)-1
i=0
while i<j:
if s1[i]!=s1[j]:
return False
i=i+1
j=j-1
return True
效率:一般!
排名第一的代码:
class Solution:
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
s = s.lower()
character = 'abcdefghijklmnopqrstuvwxyz0123456789'
l = []
for i in s:
if i in character:
l.append(i)
if l == l[::-1]:
return True
return False
总结:
当符合要求的字符量不大时,在列表中比对效率更高!
Python中回文最好的验证方式:切片
C解答:
代码:
注:同样的测试用例,在自己的电脑上没有任何问题,但在leetcode平台显示解答错误,用playground测试也没问题...
心态有点崩,求大神解答!
bool isPalindrome(char* s) {
int len=strlen(s);
if(len==0) return true;
int i,j=0;
char* s1=(char*)malloc((len+1)*sizeof(char));
for(i=0;i<len;i++)
{
if((s[i]>='0'&&s[i]<='9')||(s[i]>='A'&&s[i]<='z'))
{
if(s[i]>='A'&&s[i]<='Z') s[i]=s[i]+32;
s1[j]=s[i];
j++;
}
}
j=strlen(s1)-1;
i=0;
while(i<j)
{
if(s1[i]!=s1[j]) return false;
i++;
j--;
}
return true;
}