Javascript 很难理解最长回文算法

Javascript 很难理解最长回文算法,javascript,algorithm,palindrome,Javascript,Algorithm,Palindrome,我发现这个解决方案对于一个关于在子字符串中查找最长回文的算法问题是有意义的。然而,我很难理解扩展函数实际上在做什么。我以为它会从中心运行,但控制台日志显示它是为整个字符串运行的。我很难理解为什么它会进入任何与s[begin]==s[end]不同的字符的while循环,这就是我认为这一行所阻止的。我也不知道为什么expand会被调用两次。另外,为什么我们在返回子字符串时添加begin+1,而不仅仅是begin。代码如下。如能澄清扩建工程的方式,将不胜感激 var longestPalindrome

我发现这个解决方案对于一个关于在子字符串中查找最长回文的算法问题是有意义的。然而,我很难理解扩展函数实际上在做什么。我以为它会从中心运行,但控制台日志显示它是为整个字符串运行的。我很难理解为什么它会进入任何与
s[begin]==s[end]
不同的字符的while循环,这就是我认为这一行所阻止的。我也不知道为什么expand会被调用两次。另外,为什么我们在返回子字符串时添加
begin+1
,而不仅仅是
begin
。代码如下。如能澄清扩建工程的方式,将不胜感激

var longestPalindrome = function (s) {
    //either when empty string or is a single character
    if (!s || s.length <= 1) return s

    let longest = s.substring(0, 1)

    for (let i = 0; i < s.length; i++) {
        let temp = expand(s, i, i, 'first')
        // console.log(temp, 'i am the first')
        if (temp.length > longest.length) {
            longest = temp
        }
        temp = expand(s, i, i + 1, 'second')
        // console.log(temp, 'i am the second')
        if (temp.length > longest.length) {
            longest = temp
        }
    }
    return longest
}

const expand = (s, begin, end, counter) => {
    while (begin >= 0 && end <= s.length - 1 && s[begin] === s[end]) {
        console.log(s, 'i am string')
        console.log(begin, 'i am begin')
        console.log(end, 'i am begin')
        console.log(s[begin], s[end])
        console.log(counter)
        begin--
        end++
    }
    return s.substring(begin + 1, end)
}

console.log(longestPalindrome('cbbd'))
console.log(longestPalindrome('babad'))
console.log(longestPalindrome('ac'))
console.log(longestPalindrome('abb'))

var longestPalindrome=函数{
//当字符串为空或为单个字符时
如果(!s | | s.length最长.length){
最长=温度
}
温度=扩展(s,i,i+1,'秒')
//log(临时“我是第二个”)
如果(温度长度>最长长度){
最长=温度
}
}
回程最长
}
常量展开=(s,开始,结束,计数器)=>{
while(开始>=0&&end
然而,我很难理解expand函数实际上在做什么。我原以为它会从中心运行,但控制台日志显示它是为整个字符串运行的

回文可以有两种类型
1.偶数长度回文,例如-“abba”
2.奇数长度回文,例如-“aba”

现在,给定字符串的每个索引都可以是这两种回文的中心。 因此,字符串的每一个索引都要测试这种可能性

longestPalindrome
函数获取字符串,并针对字符串的每个索引,将该索引作为奇数长度回文和偶数长度回文的中心进行测试

expand
函数获取两个中心索引并开始向外扩展。对于奇数长度回文,应将中心字符与其自身进行比较。因此,调用
expand
,同时将
begin
end
作为同一索引

我很难理解为什么它会进入与s[begin]===s[end]不同的任何字符的while循环,这就是我认为这一行所阻止的

longestPalindrome
将发送两个索引,使得此条件
s[begin]==s[end]
为非真,但
while
循环将检查并不再进一步扩展它们。如果需要,可以通过
longestPalindrome
函数阻止此功能

我也不知道为什么expand会被调用两次

这是因为这两种回文的长度不同。你需要测试这两种回文

另外,我们为什么要在返回子字符串时添加begin+1而不是begin呢

这是因为
begin
while
循环中出现if时是一次性的。您可以在纸上进行模拟,以便更好地理解

然而,我很难理解expand函数实际上在做什么。我原以为它会从中心运行,但控制台日志显示它是为整个字符串运行的

回文可以有两种类型
1.偶数长度回文,例如-“abba”
2.奇数长度回文,例如-“aba”

现在,给定字符串的每个索引都可以是这两种回文的中心。 因此,字符串的每一个索引都要测试这种可能性

longestPalindrome
函数获取字符串,并针对字符串的每个索引,将该索引作为奇数长度回文和偶数长度回文的中心进行测试

expand
函数获取两个中心索引并开始向外扩展。对于奇数长度回文,应将中心字符与其自身进行比较。因此,调用
expand
,同时将
begin
end
作为同一索引

我很难理解为什么它会进入与s[begin]===s[end]不同的任何字符的while循环,这就是我认为这一行所阻止的

longestPalindrome
将发送两个索引,使得此条件
s[begin]==s[end]
为非真,但
while
循环将检查并不再进一步扩展它们。如果需要,可以通过
longestPalindrome
函数阻止此功能

我也不知道为什么expand会被调用两次

这是因为这两种回文的长度不同。你需要测试这两种回文

另外,我们为什么要在返回子字符串时添加begin+1而不是begin呢


这是因为当if从
while
循环中出来时,
begin
是一次性的。你可以在纸上做一个模拟来更好地理解。

好吧,假设我们想在s='abba'时找到s的回文

注意:把扩展想象成一个回文查找器,它接受中心索引。记住,我会在后面解释扩展是如何工作的

我们将把展开的中心从0移到3(最终索引)。首先,它检查从begin=0到end=0的展开

s = 'abba'
如果begin=0,end=0,则展开返回“a”

v___
abba //only the palindrome from 0 is 'a'
如果begin=0,end=1,则展开返回“”

_v___
a bba //there are no palindrome from between 0 and 1 
如果begin=1和end=1,则展开返回“b”

_v__
abba //only the palindrome from 1 is 'b'
如果begin=1,end=2,则展开返回“abba”

__v__
ab ba //the palindrome from between b and b is 'abba'
如果begin=2和end=2,则展开返回“b”

如果begin=2,end=3,则展开返回“”

如果begin=3,end=3,则展开返回“a”

现在,我们已经测试了所有可能的s回文。最后,代码返回到目前为止最长的回文,在本例中是“abba”

注意我们为什么要
_v__
abba
__v__
ab ba
____vv____
aacdeedcba
___v__v____
aacdeedcba
__v____v__
aacdeedcba
_v______v_
aacdeedcba