Zeichenketten-Rotation prüfen
Bei einer Zeichenkettenrotation bleiben alle Zeichen in derselben zyklischen Reihenfolge, während ein Präfix vom Anfang an das Ende oder entsprechend ein Suffix an den Anfang verschoben wird.
Im Browser ausführen – kostenlos
Dieses Werkzeug vergleicht zwei Zeichenketten und meldet, ob sich die zweite durch eine beliebige Anzahl von Verschiebungen, einschließlich null, aus der ersten bilden lässt. Der Vergleich ist exakt; Großschreibung, Leerzeichen, Satzzeichen und Unicode-Zeichen sind daher relevant. Da eine Rotation keine Zeichen hinzufügt oder entfernt, führen unterschiedliche Längen zu einem eindeutigen Validierungsfehler statt zu einem negativen Ergebnis.
Was als Zeichenkettenrotation gilt
Eine Rotation ändert den Startpunkt einer Zeichenkette, ohne die zyklische Reihenfolge ihrer Zeichen zu verändern. Wird beispielsweise bei „waterbottle“ der Anfang „wat“ ans Ende verschoben, entsteht „erbottlewat“. Der Kandidat enthält genau dieselben Zeichen in genau derselben zyklischen Ordnung; nur die Grenze zwischen Ende und Anfang liegt an einer anderen Stelle. Auch eine Verschiebung um null Positionen ist gültig, sodass jede Zeichenkette eine Rotation ihrer selbst ist. Wiederholte Zeichen ändern diese Regel nicht, können aber dazu führen, dass mehrere Rotationspositionen dasselbe sichtbare Ergebnis erzeugen. Diese Prüfung ist strenger als ein Anagrammtest. Bei Anagrammen dürfen Zeichen beliebig neu angeordnet werden, Rotationen bewahren dagegen ihre Ordnung im Kreis. Der Abgleich erfolgt außerdem wörtlich und berücksichtigt Groß- und Kleinschreibung. Leerzeichen, Satzzeichen, kombinierende Zeichen und Zeilenumbrüche gehören ebenfalls zum Vergleich. Geben Sie den Ausgangswert in `first` und den Kandidaten in `second` ein; das Ergebnis enthält den einzelnen booleschen Wert `is_rotation`.
So arbeitet die Prüfung
Zunächst wird geprüft, ob beide Felder Zeichenketten sind und dieselbe Länge besitzen. Gleiche Länge ist zwingend, denn bei einer Rotation werden niemals Zeichen eingefügt oder gelöscht. Unterscheiden sich die Längen, wird die Anfrage als ungültige Eingabe abgelehnt. Dadurch bleibt eine fehlerhaft angelegte Prüfung von einem zulässigen, gleich langen Kandidaten unterscheidbar, der lediglich keine Rotation ist. Bei gültigen Eingaben sucht die Implementierung den Kandidaten während zweier aufeinanderfolgender Durchläufe durch die ursprüngliche Zeichenkette. Jede mögliche Rotation muss in diesem kreisförmigen Suchraum vorkommen. Eine Präfixtabelle verhindert, dass nach jeder teilweise passenden Fundstelle wieder beim nächsten Zeichen begonnen werden muss, und sorgt für deterministisches lineares Verhalten bezogen auf die Eingabelänge. Es werden weder Netzwerkdienste noch Sprachmodelle oder Gebietsschemata verwendet; außerdem findet keine Textnormalisierung statt. Dieselbe Folge von Codeeinheiten liefert daher stets dieselbe Antwort. Zwei leere Zeichenketten sind gegenseitige Rotationen, und identische nicht leere Werte erfüllen den gültigen Fall einer Verschiebung um null.
Ergebnisse auswerten und Eingaben vorbereiten
Das Ergebnis `true` bedeutet, dass mindestens eine kreisförmige Verschiebung von `first` vollständig mit `second` übereinstimmt. `false` bedeutet, dass beide Zeichenketten gleich lang sind, aber keine Verschiebung einen exakten Treffer ergibt. Entscheiden Sie vor dem Vergleich von Texten aus verschiedenen Quellen, ob eine wörtliche Prüfung zu Ihrem Anwendungsfall passt. Diese Funktion entfernt keine Leerzeichen, vereinheitlicht keine Groß- und Kleinschreibung, löscht keine Satzzeichen und führt keine Unicode-Normalisierung aus, da solche Umformungen die übermittelten Zeichenketten unbemerkt verändern würden. Falls Ihre Anwendung „A“ und „a“ gleichsetzt oder zusammengesetzte und zerlegte Unicode-Formen als gleich behandelt, normalisieren Sie beide Werte vor dem Senden einheitlich. Bewahren Sie führende oder nachgestellte Leerzeichen, wenn sie Bestandteil von Kennungen oder codierten Folgen sind. Der API-Grundpreis beträgt $0.002 pro Anfrage; die Browserversion kann dieselbe deterministische Logik lokal ausführen. Automatisierte Tests sollten positive Rotationen, gleich lange Gegenbeispiele, Wiederholungen, identische Werte und den Fehler bei abweichenden Längen enthalten.
Anwendungsfälle
Ausgabe eines Ringpuffers validieren
Bestätigen Sie, dass ein erfasster Puffer die erwartete Folge enthält, auch wenn das Lesen an einer anderen Stelle des Zyklus begann.
Programmieraufgaben testen
Prüfen Sie erwartete Lösungen für Rotationsaufgaben, ohne zyklische Reihenfolge mit einer freien Anagrammanordnung zu verwechseln.
Zyklische Kennungen vergleichen
Ermitteln Sie, ob zwei gleich lange Darstellungen denselben wiederkehrenden Zyklus mit verschiedenen Startpunkten beschreiben.
Häufige Fragen
Gilt eine unveränderte Zeichenkette als Rotation?
Ja. Eine Verschiebung um null Positionen ist zulässig, daher ist jede Zeichenkette eine Rotation ihrer selbst.
Werden Groß- und Kleinbuchstaben gleich behandelt?
Nein. Der Vergleich ist exakt und beachtet die Großschreibung; die jeweiligen Codeeinheiten unterscheiden sich.
Was geschieht bei unterschiedlichen Längen?
Die Funktion gibt einen Fehler für ungültige Eingaben zurück, weil eine Rotation die Zeichenanzahl nicht ändern kann.
Ist eine Zeichenkettenrotation dasselbe wie ein Anagramm?
Nein. Eine Rotation bewahrt die zyklische Reihenfolge, während ein Anagramm Zeichen beliebig neu anordnen darf.
Gelten leere Zeichenketten als Rotationen?
Ja. Zwei leere Zeichenketten sind gleich lang und stimmen bei einer Verschiebung um null Positionen überein.
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem Stack
curl -X POST https://api.kit.forhosting.com/text/string-rotation-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"first":"waterbottle","second":"erbottlewat"}'const res = await fetch("https://api.kit.forhosting.com/text/string-rotation-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"first": "waterbottle",
"second": "erbottlewat"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/string-rotation-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"first": "waterbottle",
"second": "erbottlewat"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/string-rotation-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"first":"waterbottle","second":"erbottlewat"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"first":"waterbottle","second":"erbottlewat"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/string-rotation-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Beispiel-Anfrage
{
"first": "waterbottle",
"second": "erbottlewat"
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.string_rotation_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Limits
max_tokens | 20000 |
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |