回文串定义
回文串是一个字符串,忽略大小写和非字母数字,正着读和反着读是一样的
第一种方法:使用reverse()方法
注意:若是字符串较长性能会降低
思路
- 定义一个空数组arr,用来存储合法的字符
- 将合法的字符存进arr数组,并转化为字符串
- 反转字符串与原字符串比较
// 定义一个字符串变量
let str = '123a b, cdefgh好ighthgihgf e/dc人bA321'
// 设置一个数组,用来储存过滤后的字符
let arr = []
for(let i = 0; i < str.length; i++) {
// 去掉除了a~z, A~Z, 0~9之外的字符
if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= '0' && str[i] <= '9')) {
arr.push(str[i])
}
}
// 将数组中的字符拼接成字符串并且全部转化为小写
let reverseArr = arr.reverse().join('').toLocaleLowerCase() // 123abcdefghighthgihgfedcba321
// 将原数组中的字符拼接成字符串并转化为小写
let arrStr = arr.join('').toLocaleLowerCase() // 123abcdefghighthgihgfedcba321
console.log(reverseArr === arrStr); // true
第二种方法:使用左右指针
思路
- 定义一个左指针和右指针,本别指向字符串的开头和结尾,当右指针的下标小于左指针时,进行循环
- 判断左右字符串是否合法,若是左指针不合法,则左指针加1,若是右指针不合法,则右指针减1
- 若是左右指针指向的字符相等,则左指针加1,右指针减1。若是左右指针指向的字符不相等,直接返回false
- 若是循环执行完毕,返回true
let str = '123a b, cdefgh好ighthgihgf e/dc人bA321'
// 判断回文串的函数
function isPalindrome(s) {
// 判断是否是有效字符
const isValid = (c) => (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')
// 定义左右指针,分别指向字符串的头和末尾
let i = 0, j = str.length - 1
// 当右指针大于左指针时循环
while(j >= i) {
const left = s[i].toLocaleLowerCase(), right = s[j].toLocaleLowerCase()
if(!isValid(left)) { // 判断左指针字符是否合法
i++
}else if(!isValid(right)){ // 判断右指针字符是否合法
j--
}else if(left === right) { // 若是左右指针的字符相等,i++, j--
i++
j--
}else { // 若是不相等,直接返回false
return false
}
}
return true
}
console.log(isPalindrome(str));
更多关于前端的知识请关注我的花园
地址: https://www.yuque.com/linghualuan