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

时间:2018-09-26 02:20:39

标签: javascript palindrome

好的,所以我正在尝试改进我的JS,并且遇到了流行的Palindrome Checker练习。这次,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的意义是什么?尤其是在函数末尾。

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

2 个答案:

答案 0 :(得分:1)

要回答第一个问题,“后退”是一个指向字符串后部的指针。其值为str.length - 1的原因是,尽管索引从0开始,str.length将给出字符串中属性的数量。因此,您需要从长度中减去1以获得最后一个属性的索引。

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

答案 1 :(得分:1)

这是同时查看字符串的开头和字符串的结尾并进行比较。在每个循环中,它都会使前进和后退:

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.

如果继续返回true,则说明您有回文。

您可能会遇到的问题是回文,例如:

  

夫人,我是亚当

'和空格将其弄乱了,但大多数人仍将其称为回文。这就是为什么您有这样的行:

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

.match(/[\W_]/)测试字母是否是“'单词”之类的“非单词”字母,甚至是一个空格,然后将前向指针向后移动经过它。这使测试不必关心空格和非单词字符。

相关问题