使用递归计算回文数
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");
所以基本上,如果您通过扫描字符串并将 current
与 current+1
和 current+2
在迭代循环中并将匹配存储为具有开始结束结束索引的对象。
你开始计算数组的长度。
通过过滤更新对象的元素来更新数组,如果第一个较大的是回文,并且 return true 或 return false 并将其删除。
如果数组的长度为零,你return计数
将数组长度添加到计数中并从 3 开始重复。
我目前有一个代码可以计算给定字符串中的回文,它工作正常,直到我用“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");
所以基本上,如果您通过扫描字符串并将
current
与current+1
和current+2
在迭代循环中并将匹配存储为具有开始结束结束索引的对象。你开始计算数组的长度。
通过过滤更新对象的元素来更新数组,如果第一个较大的是回文,并且 return true 或 return false 并将其删除。
如果数组的长度为零,你return计数
将数组长度添加到计数中并从 3 开始重复。