125. 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
-
分析
首先要过滤出数字和字母,然后进行回文判断
方法1,是直接过滤掉非数字和字母的,然后回文判断,见code1。
方法2,是将数字、大小写字母存到map[byte]int中,数字对应的数字字符对应的ASCII,字母对应的小写字母的ASCII,回文判断,若不是合法字符,即map中不存在该数据,则获取下一个字母,若都是合法字符,则判断二者的对应的ASCII是否相等,直到结束,见code2。
方法3,添加了一合法字符判断的辅助函数,并返回对应的ASCII码,大写字母的返回小写字母的ASCII码,不合法的返回-1,回文比较,不是合法,直接获取下一个,若都是合法,则直接判断是否相等,不等返回false结束,若相等,则继续,知道i>=j,见code3。 -
code3
func isAlph(b byte)int{
if b>='A'&&b<='Z'||b>='0'&&b<='9'{
return int(b)
}else if b>='a'&&b<='z'{
return int(b)-32
}
return -1
}
func isPalindrome(s string) bool {
i,j:=0,len(s)-1
for i<j{
a:=isAlph(s[i])
if a==-1{
i++;continue
}
b:=isAlph(s[j])
if b==-1{
j--;continue
}
if a==b{
i++;j--
}else{
return false
}
}
return true
}
- code2
func isPalindrome(s string) bool {
mp:=make(map[int]int)
for i:=0;i<26;i++{
mp[int('a')+i]='a'+i;mp[int('A')+i]='a'+i//将字母都存为小写字母
}
for i:=0;i<10;i++{
mp[int('0')+i]='0'+i
}
i:=0;j:=len(s)-1
for i<j{
a,b,ok:=0,0,true
if a,ok=mp[int(s[i])];ok==false{
i++;continue
}
if b,ok=mp[int(s[j])];ok==false{
j--;continue
}
if a!=b{
return false
}
i++;j--
}
return true
}
- code1
func isPalindrome(s string) bool {
ss:=make([]int,0);a:='a';A:='A'
mp:=make(map[int]bool)
for i:=0;i<26;i++{
mp[int(a)+i]=true;mp[int(A)+i]=true
}
for i:=0;i<10;i++{
mp[int('0')+i]=true
}
for i:=0;i<len(s);i++{
if _,ok:=mp[int(s[i])];ok{
if s[i]>='A'&&s[i]<='Z'{
ss=append(ss,int(s[i])+32)
}else{
ss=append(ss,int(s[i]))
}
}
}
i:=0;j:=len(ss)-1
for i<j{
if ss[i]!=ss[j]{
return false
}
i++;j--
}
return true
}