有人可以解释这个回文解决方案吗?
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 和非单词字符。
好的,所以我正在努力改进我的 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 和非单词字符。