前端算法(74)

87 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

输入: s = " "
输出: true
解释: 在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

题目解析

思路一

我们先用正则表达式匹配出所有不是数字和字母的字符并将他们替换为空串,在用while循环将头和尾同时遍历判断是否字符正确,由于我们不区分大小写字母、但是其大小写Ascii码值相差32,所以可以用来作判断,由于0PAscii码值刚好相差32并且不为回文串,所以可以放在函数首行判断返回false。

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function(s) {
  if(s == "0P"){
    return false;
  }
  const reg = /[^A-Za-z0-9]+/g;
  s = s.replace(reg,"");
  let num1=0,num2=s.length-1;
  while(num2>=0){
    let Ascii1 = s.charCodeAt(num1++);
    let Ascii2 = s.charCodeAt(num2--);
    if(Ascii1 != Ascii2 && Math.abs(Ascii1-Ascii2)!=32){
      return false;
    }
  }
  return true;
};

思路二

var isNumberOrStr = (str)=>{
        //判断这个字符是否是数字
        let isNum =  /[0-9]/.test(Number(str));
        //判断这个字符是否是字母
        let isStr = /[a-zA-Z]/.test(String(str));
        if(isNum || isStr){
            return true;
        }
        return false;
    }
var isPalindrome = function(s) {
        //新建一个空字符串名为sb
        var sb = "";
        for(let i=0;i<s.length;i++){
            //取得每一个字符
            let char = s.charAt(i);
            //判断当前字符是数字或者是字母
            if(isNumberOrStr(char)){
                 //去掉空格,空格不能有的
                char = char.replace(/\s+/g,'');
                 //将满足条件的字符,再转为小写字母,添加到sb里
                sb += String.prototype.toLowerCase.call(char);
            }

        }
        //新建一个字符串sb2为字符串sb的拷贝
        var sb2 = sb.concat();
        //反转sb2,先split再reverse最后join连接
        sb2 = sb2.split("").reverse().join("");
        return sb === sb2;
};