Codewars Lösung | Merge overlapping strings


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|2. Februar 2024
2 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

Die Fakten:

Plattform:codewars.com
Name:Merge overlapping strings
Level:7 kyu
Sprache:TypeScript

Beschreibung:

This kata requires you to write a function which merges two strings together. It does so by merging the end of the first string with the start of the second string together when they are an exact match.

"abcde" + "cdefgh" => "abcdefgh"
"abaab" + "aabab" => "abaabab"
"abc" + "def" => "abcdef"
"abc" + "abc" => "abc"

NOTE: The algorithm should always use the longest possible overlap.

"abaabaab" + "aabaabab" would be "abaabaabab" and not "abaabaabaabab"

Quelle: codewars.com

Lösung

Pseudo-Code

Wie immer gibt's reichlich Varianten, hier ist eine meiner.

Erst die Lösungsschritte in Pseudo-Code. Los geht’s:

Lösungsschritte
Schritt 1

Wir loopen durch den ersten String.

Schritt 2

Wir kucken, ob der zweite String mit dem ersten String beginnt.

Schritt 3

Wenn nicht, nehmen wir in jeder Iteration einen Buchstaben vom Anfang des ersten Strings weg und checken nochmal.

Schritt 4

Wenn ja, können wir den zweiten String anhängen an den Anfang vom ersten String bis zu diesem Punkt.

Code

Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:

Lösungsschritte
Meine erste Zeile:
export const mergeStrings = (first: string, second: string): string => {
Erstmal den Loop durch den ersten String aufsetzen:
  for (let i = 0; i < first.length; i++) {

Standard for-Loop. Nüscht Besonderes.

Das jeweils aktuelle Ende des ersten Strings speichere ich mir der Lesbarkeit halber in einer Variablen ab (optional):
const firstEnd = first.slice(i, first.length); // optional
Jetzt können wir prüfen, ob der zweite String mit dem jeweils aktuellen Ende des ersten Strings übereinstimmt:
    if (second.startsWith(firstEnd)) {
Wenn ja, können wir den zweiten String zum Anfang des ersten Strings bis zum aktuellen Zeichen hinzufügen:
      return first.slice(0, i) + second;
    }
  }

Das Ergebnis können wir gleich zurückgeben und damit Loop und Funktion beenden.

Wenn nicht, geben wir nach dem Loop einfach den ersten + den zweiten String zurück:
  return first + second;
};
Voilá! 💪

Fragen?

Komplettlösung
export const mergeStrings = (first: string, second: string): string => {
  for (let i = 0; i < first.length; i++) {
    const firstEnd = first.slice(i, first.length);

    if (second.startsWith(firstEnd)) {
      return first.slice(0, i) + second;
    }
  }

  return first + second;
};

Feedback

Schreib mir!