目录
1,题目
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回false
。
2,代码
2.1自己完成
javascript
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
// 遍历过程情况
// 大写字母 则转化为小写字母
// 小写字母 数字 直接保留
// 非字母数字 丢掉
// 先将不必要的内容进行去除
let strInit = [];
let index = 0;
for(let i = 0;i < s.length ;i++){
if(s[i]>='a' && s[i]<='z'){
strInit[index++] = s[i];
}else if(s[i]>='A' && s[i]<='Z'){
strInit[index++] = s[i].toLowerCase();
}else if(s[i]>='0' && s[i]<='9')
{
strInit[index++] = s[i];
}
}
const oldString = strInit.join('');
const reverseString = strInit.reverse().join('');
return oldString === reverseString;
};
判断字符子否为数字,只需要判断其是否在0到9之间即可,并不存在多位数的数字情况;
数组的reverse()函数是在原函数上进行操作,所以要先保留原本的数组,这里将保留原数组和转化为字符串并为一步实现;(join()函数是不改变原来数组的)
2.2双指针
javascript
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
//双指针
let left = 0,right = s.length - 1;
while(left < right){
while (left < right && !/[a-zA-Z0-9]/.test(s.charAt(left))) {
left++;
}
while(left < right && !/[a-zA-Z0-9]/.test(s.charAt(right))){
right--;
}
if( s.charAt(left).toLowerCase() != s.charAt(right).toLowerCase()){
return false;
}else{
right--;
left++;
}
}
return true;
};
利用正则表达式对大小字母和数字进行一个匹配筛选
javascript
var isPalindrome = function(s) {
//双指针
let left = 0,right = s.length - 1;
while(left < right){
···
while(left < right && !/[a-zA-Z0-9]/.test(s.charAt(right))){
right--;
}
···
}
···
};