有人可以解释这个回文解决方案吗?

Can someone please explain this Palindrome solution?

好的,所以我正在努力改进我的 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 方法是否意味着 "return true if the argument contains these characters"?

3- "/[\W_]/" 怎么等于 "all characters"?

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

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

要回答你的第一个问题,'back' 是一个指向字符串后面的指针。之所以取值为str.length - 1是因为str.length会给出字符串中的属性个数,虽然索引是从0开始的。因此,需要将长度减1得到最后一个属性的索引。

为了回答你的最后一个问题,分别从 front/back 中加 1 / 减 1 是为了增加被测试的属性。例如,如果字符串是 "abba",在将第一个字母与最后一个字母进行比较后,它将递增计数器,以便将第一个 b(新的 'front')与第二个 b(新 'back')

这是同时看字符串的前面和字符串的结尾并进行比较。在每个循环中,它从前向后移动:

loop 1
  amanaplanacanalpanama
  |                   |
front                back

front === back? if not it iss not a palindrome

loop 2 (front+1 & back -1)
  amanaplanacanalpanama
   |                 |
 front              back

front === back?

etc.

如果这继续 return 正确,则您有一个回文。

您可能 运行 遇到的一个回文问题如下:

madam I'm adam

' 和 space 把它搞砸了,但大多数人仍然称之为回文。这就是为什么你有这样一行:

str[back].match(/[\W_]/)

.match(/[\W_]/) 测试一个字母是否是一个 "non-word" 字母,如 ''' 或者甚至是一个 space 并将前面的指针移到后面。这允许测试不关心 spaces 和非单词字符。