我想用‘双指针’模式来解决"回文"问题.以下是解决此问题的代码:

var isPalindrome = function(s) {
    const newStr = s.toLowerCase().replace(/[^0-9a-z]/g, "")

    let left = 0
    let right = newStr.length-1
    
    while (left < right) {
        if (newStr[left] !== newStr[right]) {
            return false
        }

        left++
        right--
    }

    return true
};

console.log(isPalindrome('racecar'))
console.log(isPalindrome('Ceci n’est pas une palindrome'))

上面的代码按预期工作,但问题是我不太理解这个逻辑是如何工作的:

while(left < right) 

确保解决回文问题的工作正确.比方说,我们有这个字符串‘racecar’,如果我们向左和向右移动指针指向彼此,如果两个指针都指向‘e’旁边的两个‘c’,那么While循环将在最后一次运行,但我们错过了‘e’,因为我们错过了‘e’,我们如何确定两个指针解决了回文问题?有人能澄清这一点吗?

我不明白两个指针模式如何解决回文问题,我们错过了‘e’,因为我们有这个字符串‘racecar’.

推荐答案

现在,输入可以有两种情况.

  1. 输入长度为偶数
  2. 输入长度为奇数

while(left < right)表示我们必须判断,直到左指针与右指针交叉.在此之前,如果在任何时刻左右指针上的字母不相同,则输入不是回文.

现在,当输入长度为奇数时,您可以忽略中间元素,因为它没有任何计数器匹配.

如果要显式判断arr[middle]==arr[middle]是否只在While条件中包含相等性.while(left<=right)

Javascript相关问答推荐

foreach循环中的Typescript字符串索引

具有相同参数的JS类

如何解决CORS政策的问题

防止用户在selectizeInput中取消 Select 选项

togglePopover()不打开但不关闭原生HTML popover'

如何在Angular中插入动态组件

Phaser 3 console. log()特定游戏角色的瓷砖属性

在nextjs服务器端api调用中传递认证凭证

成功完成Reducers后不更新状态

在react JS中映射数组对象的嵌套数据

Angular 中的类型错误上不存在获取属性

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

Angular 订阅部分相互依赖并返回数组多个异步Http调用

如何将数组用作复合函数参数?

向数组中的对象添加键而不改变原始变量

为什么当我更新数据库时,我的所有组件都重新呈现?

如何在Press上重新启动EXPO-AV视频?

构建器模式与参数对象输入

我的NavLink活动类在REACT-ROUTER-V6中出现问题

无法在Adyen自定义卡安全字段创建中使用自定义占位符