带JavaScript的回文索引Hackerrank

带JavaScript的回文索引Hackerrank,javascript,Javascript,我为HackerRank上的回文索引挑战提交了以下代码,但它在一些测试用例中失败,错误超过了时间限制。我不确定我的代码出了什么问题 基本上,我实现了一个独特的“helper”函数来检查字符串是否是回文。在回文索引函数中,我首先检查一个字符串是否为回文,然后返回-1,否则我将遍历该字符串,尝试删除每个字母,以查看剩余的字符串是否为回文 如果是,请在此处返回索引;否则,继续 如果循环结束时没有返回任何索引,这意味着没有结果,我将返回-1 这就是我试图做的,但我无法在这里找到问题所在。谢谢 funct

我为HackerRank上的回文索引挑战提交了以下代码,但它在一些测试用例中失败,错误超过了时间限制。我不确定我的代码出了什么问题

基本上,我实现了一个独特的“helper”函数来检查字符串是否是回文。在
回文索引
函数中,我首先检查一个字符串是否为回文,然后返回
-1
,否则我将遍历该字符串,尝试删除每个字母,以查看剩余的字符串是否为回文

如果是,请在此处返回索引;否则,继续

如果循环结束时没有返回任何索引,这意味着没有结果,我将返回
-1

这就是我试图做的,但我无法在这里找到问题所在。谢谢

function isPalindrome(s) {
      for (let i = 0; i < s.length; i++) {
            if (s[i] !== s[s.length - 1 - i]) {
                  return false;
            }
      }
      return true;
}


function palindromeIndex(s) {
      let result = isPalindrome(s);
      if (result) {
            return -1;
      }
      else {
            for (let i = 0; i < s.length; i++) {
                  let newS = s.slice(0,i) + s.slice(i+1);
                  if (isPalindrome(newS)) {
                        return i;
                  }
            }
            return -1
      }
}
函数isAlindrome(s){
for(设i=0;i
您需要优化回文函数。只需将循环从
0
运行到数组的一半

function isPalindrome(s) {
      for (let i = 0; i < s.length/2; i++) {
            if (s[i] !== s[s.length - 1 - i]) {
                  return false;
            }
      }
      return true;
}
函数isAlindrome(s){
for(设i=0;i
…否则我将遍历字符串,尝试删除每个字母 查看剩余字符串是否为回文

这就是问题所在。无需再次循环遍历整个字符串,因为一旦在字符串中找到一对断开回文的字母-答案必须是该对中第一个字母或第二个字母的索引,或者-如果删除两个字母不会产生回文-则返回
-1

函数回文索引{
函数isAlindrome(s){
对于(设i=0;iconsole.log(回文索引('baaabcc'))
我将只是起草基本想法,因为我想你想自己尝试一下:

aaa = -1   
aaab = 3   
baaa = 0   
bbaa = -1

You only want to loop through the string once.

You only need to loop through half the string, and do comparisons.
我只会专注于移动索引

字符串:
baaa

默认变量:
职位:-1
起始值:0
endNudge:0

在索引i处(从0开始):

  • 检查
    i
    +startNudge与
    string.length-1-i
    +endNudge
  • 如果不相等:
    • 检查索引
      i+1
      +startNudge与
      string.length-1-i
      +endNudge。
      • 如果相等,则将位置设置为
        i
        ,并将startNudge设置为1
    • 否则,根据
      string.length-2-i
      +endNudge检查
      i
      +startNudge。
      • 如果相等,则将位置设置为
        string.length-1-i
        并将endNudge设置为-1
    • 否则通过返回-1来中断循环
    • 如果位置已保存,则通过返回-1中断循环
  • 继续循环

如果循环完成,返回位置。

正确,但速度太慢。他们想让你找到一个更好的算法,所以他们加入了一些测试用例,这些测试用例不会在合理的时间内使用一个幼稚的算法完成。那么我该如何改进我的算法呢?我将其从0改为循环到s.length/2,但仍然不起作用,同样的错误。另外,我认为在复杂性分析方面,n和1/2*n是相同的,所以我不认为这是问题所在?你还有别的想法吗(@ChrisLe你能给我问题的链接,这样我就可以自己试试吗?@ChrisLe你可能需要一个不同的算法,用
O(N)
代替O(N^2)。我想问题也出在O(N^2)上,但不知道如何将复杂性降低到O(N):(它现在起作用了!我终于明白你的解决方案了!非常感谢@Danield