回文串:一个字符串,忽略大小写和非字母数字,正着读反着读值相同。
例如:abcba
当不忽略字符时,可以翻转后对比。
function isPalindrome(str) {
return str === str.split('').reverse().join('')
}
console.log(isPalindrome('abba')); // true
console.log(isPalindrome('a b!@#ba')); // false
console.log(isPalindrome('abcdba')); // false
若需要忽略空格或字符,可以利用两个指针,从字符串两端依次向中间,取出首尾字符两两对比。
function isPalindrome(str) {
let isValid = s => s >= 'a' && s <= 'z' || s >= '0' && s <= '9' // 验证是否是小写字母或数字
let i = 0, j = str.length - 1 // i:左指针;j:右指针
while (i < j) {
let left = str[i].toLowerCase() // 由于要求忽略大写,所以转小写
let right = str[j].toLowerCase() // 由于要求忽略大写,所以转小写
if (!isValid(left)) {
i++ // 跳过非字母或数字
} else if (!isValid(right)) {
j-- // 跳过非字母或数字
} else if (left !== right) {
return false // 不相等返回false
} else {
// 相等进行下一次循环
i++
j--
}
}
return true
}