给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
输入: "A man, a plan, a canal: Panama"
输出: true
输入: "race a car"
输出: false
双指针
- 起始一个指针l,末尾一个指针r
- 判断条件:
- 回文串
- 只考虑字母和数字字符
- 将空字符串定义为有效的回文串
let isPalindrome = s => {
let isNormalChar = a => {
return (a >= 'a' && a <= 'z')
|| (a >= 'A' && a <= 'Z')
|| (a >= '0' && a <= '9')
}
if (s === "") return true;
let l = 0, r = s.length - 1;
s = s.toLowerCase()
while (l <= r) {
if (s[l] === s[r]) {
l++;
r--;
} else if (!isNormalChar(s[l])) {
l++;
} else if (!isNormalChar(s[r])) {
r--;
} else {
return false;
}
}
return true;
}
console.log(isPalindrome("A man, a plan, a canal: Panama"));
console.log(isPalindrome("race a car"));
func isPalindrome1(s string) bool {
isNormalChar := func (a uint8) bool {
if a >= 48 && a <= 57 {
return true
} else if a >= 65 && a <= 97 {
return true
} else if a >= 90 && a <= 122{
return true
}
return false
}
if s == "" {
return true
}
s = strings.ToLower(s)
l, r := 0, len(s) - 1
for l <= r {
if s[l] == s[r] {
l++
r--
} else if !isNormalChar(s[l]) {
l++
} else if !isNormalChar(s[r]) {
r--
} else {
return false
}
}
return true
}
class Solution {
public boolean isPalindrome(String s) {
if (s.equals("")) return true;
s = s.toLowerCase();
char[] sChar = s.toCharArray();
int l = 0, r = sChar.length - 1;
while (l <= r) {
if (sChar[l] == sChar[r]) {
l++;
r--;
} else if (!isNormalChar(sChar[l])) {
l++;
} else if (!isNormalChar(sChar[r])) {
r--;
} else {
return false;
}
}
return true;
}
private boolean isNormalChar(char a){
return Character.isLowerCase(a) || Character.isUpperCase(a) || Character.isDigit(a);
}
}