fe-interview icon indicating copy to clipboard operation
fe-interview copied to clipboard

[js] 第30天 写一个方法判断字符串是否为回文字符串

Open haizhilin2013 opened this issue 6 years ago • 21 comments
trafficstars

第30天 写一个方法判断字符串是否为回文字符串

haizhilin2013 avatar May 15 '19 20:05 haizhilin2013

https://leetcode-cn.com/problems/valid-palindrome/

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama" 输出: true 示例 2:

输入: "race a car" 输出: false

大概步骤:

  • 获取有效的字符串,我们利用正则去匹配字母和数字,因为忽略大小写,所以我们转成小写
  • 然后利用 split('') 把字符串分割成数组,再用数组的 reverse() 去反转,再用 join(‘’) 去拼接
  • 最后进行比较
/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function(s) {
  if (s.length === 1) return true
  const str = s.replace(/[^a-zA-Z0-9]/g, "").toLowerCase()
  const strReverse = str.split('').reverse().join('')
  return str === strReverse
};

tiu5 avatar May 16 '19 01:05 tiu5

function cheackstr(str){ var reversestr=str.split("").reverse().join(""); if(str===reversestr){ alert("我是回文字符串"); }else{ alert("我不是回文字符串") } }

sansini avatar May 16 '19 10:05 sansini

function cheackstr(str){
  var reversestr=str.split("").reverse().join("");
  if(str===reversestr){
    alert("我是回文字符串");
  }else{
    alert("我不是回文字符串")
  }
}

myprelude avatar Jun 13 '19 07:06 myprelude

const isPalindrome = (str) =>
  str ===
  str
    .split("")
    .reverse()
    .join("");

console.log(isPalindrome("abc"));
console.log(isPalindrome("abcdcba"));
console.log(isPalindrome("abccba"));
console.log(isPalindrome("abccbaabc"));

Konata9 avatar Jul 10 '19 11:07 Konata9

function cheackstr(str){
  var reversestr=str.split("").reverse().join("");
  if(str===reversestr){
    alert("我是回文字符串");
  }else{
    alert("我不是回文字符串")
  }
}

15190408121 avatar Sep 21 '19 11:09 15190408121

function isPalindrome(str) {
  let lp = 0,
    rp = str.length - 1;
  while (lp <= rp) {
    if (str[lp++] != str[rp--]) return false;
  }
  return true;
}

0x3c avatar Mar 08 '20 04:03 0x3c

function isPalindrome(str) {
  let lp = 0,
    rp = str.length - 1;
  while (lp <= rp) {
    if (str[lp++] != str[rp--]) return false;
  }
  return true;
}

双指针从头尾往中间遍历,这个效率比前面的回答高多了

gaoryrt avatar Mar 09 '20 03:03 gaoryrt

function isPalindrome(str) {
  let lp = 0,
    rp = str.length - 1;
  while (lp <= rp) {
    if (str[lp++] != str[rp--]) return false;
  }
  return true;
}

双指针从头尾往中间遍历,这个效率比前面的回答高多了

没有考虑无效字符以及大小写,不过双指针还是高效。

ferrinweb avatar Mar 09 '20 04:03 ferrinweb

const fn = (str) => {
    str = str.replace(/(\W+)|(\_+)/g, '');
    let newStr = str.split('').reverse().join('');
    if (str === newStr) {
        return true;
    }
    return false;
}

zxl-lxz avatar Mar 26 '20 01:03 zxl-lxz

const check = s => { return s === s.split('').reverse().join(''); }

console.log(check('aba'));

NAZBIN avatar Jun 03 '20 14:06 NAZBIN

    function isPalindrome (st){
      let tem = st.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()
      return tem == tem.split('').reverse().join('')
    }

blueRoach avatar Jun 29 '20 08:06 blueRoach

把上边各位的答案做了一下总结

题目链接

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama" 输出: true 示例 2:

输入: "race a car" 输出: false

这个题的关键点在于判断字符串(长度为n)的第i个字符和第(n - 1) - i字符是否相等

'1 2 3 4 3 2 1 '  =>  length -> 7
 0 1 2 3 4 5 6
 str[0] == str[6]
 str[1] == str[5]
 str[2] == str[4]

方法一

使用for循环进行遍历

/**
 * @description: 判断字符串是否是回文字符串
 * @param {string} str
 * @return {boolean} 
 */
function isPalindrome(str) {
    if (str.length === 1) return true;
    str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
    for (let i = 0; i < str.length; i++) {
        if (str[i] != str[str.length - 1 - i]) {
            return false;
        }
    }
    return true;
}

方法二

通过数组反转字符,然后再和原字符串进行比较

/**
 * @description: 判断字符串是否是回文字符串
 * @param {string} str 
 * @return {boolean} 
 */
function isPalindrome(str) {
    if (str.length === 1) return true;
    str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
    const strReverse = str.split('').reverse().join('');
    return str == strReverse;
}

方法三

双指针遍历,从两边向中间进行遍历。其实和第一种方法中的for循环中if语句的判断条件类似

function isPalindrome(str) {
    if (str.length === 1) return true;
    str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();

    let lp = 0,
        rp = str.length - 1;
    while (lp <= rp) {
        // 这里lp再进行str[lp]运算,然后再自增
        if (str[lp++] != str[rp--]) {
            return false;
        }
    }
    return true;
}

CoderLeiShuo avatar Aug 08 '20 03:08 CoderLeiShuo


function judgeStr(s) {
    let str = s.toLocaleLowerCase().replace(/[^a-zA-Z0-9]/g,'')
    
    let strRe = str.split('').reverse().join('');
    
    return str === strRe; 
}


laboonly avatar Aug 24 '20 16:08 laboonly

/**

  • @param {string} s
  • @return {boolean} */ var isPalindrome = function(s) { if (s.length === 1) return true const str = s.replace(/[^a-zA-Z0-9]/g, "").toLowerCase() const strReverse = str.split('').reverse().join('') return str === strReverse };

smile-2008 avatar Sep 29 '20 07:09 smile-2008

function cheackstr(str) { str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() if (str == [...str].reverse().join('')) { return true } else { return false } }

iceCream0311 avatar Nov 18 '20 06:11 iceCream0311

function isPalindrome(str) {
  const rts = str.split('').reverse().join('');
  return rts === str;
}

ttop5 avatar Nov 18 '20 06:11 ttop5

HNHED avatar Sep 04 '21 11:09 HNHED

var str = '锵咚锵';

function isPalindrome(data) { if (data.length === 1) return true; let str1 = data.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); let str2 = str1.split('').reverse().join(''); return str1 === str2 } console.log(isPalindrome(str));

github-cxtan avatar Feb 23 '22 07:02 github-cxtan

// 判断是否为回文字符串 var str8 = 'KabcdDcBak' function isPalindrome(str) { // 转成小写 str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); // 第一种 // let str1 = str.split('').reverse().join('') // return str === str1

  // 第二种 双指针遍历
  let arr = str.split('')
  let i = 0, k = str.length -1
  while(i<k) {
    if (arr[i++] != arr[k--]) {
      return false
    }
  }
  return true

}
console.log(isPalindrome(str8))

xiaoqiangz avatar May 30 '22 02:05 xiaoqiangz

  let str = 'abcdcba';
  isOk = true;
  for (let i = 0; i < str.length; i++) {
    if (i > str.length / 2) {
      break;
    }
    if (str[i] !== str[str.length - 1 - i]) {
      isOk = false;
    }
  }
  console.log(isOk);

wenxd avatar Jun 06 '22 21:06 wenxd

function isPalindrome(str){
    is(str.length === 1) return true;
    str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
    for(let i = 0; i < str.length; i++){
        if(str[i] !== str[str.length - 1 - i]){
            return fasle;
        }
    }
    return true;
}
function isPalindrome(str){
    is(str.length === 1) return true;
    str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
    let newStr = str.split('').reverse().join('');
    return str === newStr;
}
function isPalindrome(str){
    is(str.length === 1) return true;
    str = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
    let lp = 0,
         rp = str.length -1;
    while(lp <= rp){
         if(str[lp++] !== str[rp--]){
              return false;
         }
    }
    return true;
}

wyy-g avatar Sep 16 '22 14:09 wyy-g