使用递归计算回文数

Counting Palindromes using recursion

我目前有一个代码可以计算给定字符串中的回文,它工作正常,直到我用“appal”函数 returned 0 测试它应该 return 2 ( appa 和 pp) 如果有人可以编辑我当前的代码以满足该要求,我将不胜感激,谢谢! 这是我的代码:

function countPalindromes(string, count) {
  if (string.length <= 1) {
    return count;
  }

  let [ firstLetter ] = string;
  let lastLetter = string[string.length - 1];

  if (firstLetter === lastLetter) {
    let stringWithoutFirstAndLastLetters = string.substring(1, string.length - 1);
    return countPalindromes(stringWithoutFirstAndLastLetters, count + 1);
  } else {
    return 0;
  }
}

console.log(countPalindromes("kayak", 0));
console.log(countPalindromes("aya", 0));
console.log(countPalindromes("appal", 0));

function isPalindrome(str) {
  return str == str.split("").reverse().join("");
}
//iterative only solution
function countPalindromes(s) {
  let count = 0;
  for (let i = 0; i < s.length - 1; i++) {
    const sub = s.slice(i);

    for (let j = 2; j < sub.length + 1; j++) {
      if (isPalindrome(sub.slice(0, j))) {
        count++
      }
    }
  }
  return count;
}

console.log(countPalindromes("kayak"));
console.log(countPalindromes("aya"));
console.log(countPalindromes("appal"));

您正在比较第一个字母和最后一个字母,并将 return 归零,因为这对于 appal 为假,而对于其他 2 个测试用例为真。

我认为这个函数可以解决问题。很高兴重构并稍后解释。我宁愿编写一个新函数,因为我认为您的代码还没有接近执行任务。

function returnNumberOfPalindromes(word) {
    function isPalindrome(chunk) { 
        return [...chunk].reverse().join('') === chunk;
    }
    let tally = 0;
  
    for (let index1 = 0; index1 <= word.length; index1++) {
      for (index2 = index1 + 2; index2 <= word.length; index2++) { 
        let chunk = word.slice(index1, index2); 
        if (isPalindrome(chunk)) {
            tally += 1;
        };
      }
    }
    console.log(tally);
}

returnNumberOfPalindromes("kayak");
returnNumberOfPalindromes("aya");
returnNumberOfPalindromes("appal");
returnNumberOfPalindromes("addadaadd");

  1. 所以基本上,如果您通过扫描字符串并将 currentcurrent+1current+2 在迭代循环中并将匹配存储为具有开始结束结束索引的对象。

  2. 你开始计算数组的长度。

  3. 通过过滤更新对象的元素来更新数组,如果第一个较大的是回文,并且 return true 或 return false 并将其删除。

  4. 如果数组的长度为零,你return计数

  5. 将数组长度添加到计数中并从 3 开始重复。