Palindrome mit Rekursion zählen

Nov 11 2020

Ich habe derzeit einen Code, der die Palindrome in einer bestimmten Zeichenfolge zählt, und er funktionierte einwandfrei, bis ich ihn mit "appal" testete. Die Funktion gab 0 zurück, wenn sie 2 zurückgeben sollte (appa und pp). Ich würde es wirklich begrüßen, wenn jemand meine bearbeiten könnte aktueller Code, damit er diese Anforderung erfüllt, danke! Hier ist mein Code:

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));

Antworten

tonitone120 Nov 12 2020 at 03:47

Ich denke, diese Funktion macht den Trick. Gerne umgestalten und später erklären. Ich würde lieber eine neue Funktion schreiben, weil ich nicht glaube, dass Ihr Code kurz vor der Ausführung der Aufgabe steht.

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");

CandaceAhrends Nov 12 2020 at 01:34

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"));

Sie vergleichen den ersten Buchstaben mit dem letzten Buchstaben und geben Null zurück, da dies für appal falsch und für die anderen beiden Testfälle wahr ist.

Sylwester Nov 12 2020 at 13:01
  1. Wenn Sie also ein Palindrom wie ppoder finden, apaindem Sie die Zeichenfolge scannen und die currentmit current+1und current+2in einer iterativen Schleife vergleichen und die Übereinstimmungen als Objekte mit Start-End-End-Index speichern.

  2. Sie initiieren eine Zählung, die der Länge des Arrays entspricht.

  3. Aktualisieren Sie das Array, indem Sie die Elemente filtern, bei denen Sie das Objekt mit einem weniger und einem weiteren für das Start-Ende aktualisieren, wenn die 1 größer ein Palindrom ist und true oder false zurückgeben und es entfernen.

  4. Wenn das Array die Länge Null hat, geben Sie die Anzahl zurück

  5. Addieren Sie die Array-Länge zur Anzahl und wiederholen Sie ab 3.