首页 > 解决方案 > 有人可以解释一下这个回文解决方案吗?

问题描述

好的,所以我正在尝试改进我的 JS,并且遇到了流行的回文检查器练习。这次,freeCodeCamp 的这个解决方案应该表现得很好,但我无法理解它的几个方面。

/this solution performs at minimum 7x better, at maximum infinitely better.
    //read the explanation for the reason why. I just failed this in an interview.
    function palindrome(str) {
      //assign a front and a back pointer
      let front = 0
      let back = str.length - 1

      //back and front pointers won't always meet in the middle, so use (back > front)
      while (back > front) {
        //increments front pointer if current character doesn't meet criteria
        if ( str[front].match(/[\W_]/) ) {
          front++
          continue
        }
        //decrements back pointer if current character doesn't meet criteria
        if ( str[back].match(/[\W_]/) ) {
          back--
          continue
        }
        //finally does the comparison on the current character
        if ( str[front].toLowerCase() !== str[back].toLowerCase() ) return false
        front++
        back--
      }

      //if the whole string has been compared without returning false, it's a palindrome!
      return true

    }

现在,我对这段代码有几个问题:

1-将str的长度减少1有什么意义?我已经在几个回文跳棋中看到了这一点,但我仍然无法理解它。

2- .match 方法是否意味着“如果参数包含这些字符,则返回 true”?

3-为什么“/[\W_]/”等于“所有字符”?

4-前后加1和减1有什么意义?尤其是在函数的最后。

谢谢,如果这是一个愚蠢的问题,我很抱歉,我真的很想理解这里的逻辑。

标签: javascriptpalindrome

解决方案


为了回答你的第一个问题,'back' 是一个指向字符串后面的指针。它的值是str.length - 1因为str.length会给出字符串中属性的数量,尽管索引从 0 开始。因此,您需要从长度中减去 1 以获得最后一个属性的索引。

要回答您的最后一个问题,分别从正面/背面加 1 / 减 1 是为了增加正在测试的属性。例如,如果字符串是“abba”,在比较第一个字母和最后一个字母后,它将递增计数器,以便将第一个 b(新的 'front')与第二个 b(新的 'back ')


推荐阅读