Verificare la rotazione di stringhe
Una rotazione di stringa conserva tutti i caratteri nello stesso ordine circolare, spostando però un prefisso dall’inizio alla fine o, in modo equivalente, un suffisso all’inizio.
Esegui gratis nel browser
Questo strumento confronta due stringhe e indica se la seconda si può ottenere ruotando la prima di un numero qualsiasi di posizioni, compreso zero. Il confronto è esatto: maiuscole, spazi, punteggiatura e caratteri Unicode restano significativi. Poiché una rotazione non aggiunge né rimuove caratteri, lunghezze diverse producono un chiaro errore di convalida anziché un risultato negativo.
Che cosa si intende per rotazione di stringa
Una rotazione cambia il punto iniziale di una stringa senza modificare la sequenza circolare dei caratteri. Per esempio, ruotando “waterbottle” e portando i primi tre caratteri alla fine si ottiene “erbottlewat”. La candidata contiene esattamente gli stessi caratteri nello stesso ordine ciclico; cambia soltanto il confine tra fine e inizio. Anche una rotazione di zero posizioni è valida, quindi ogni stringa è sempre una rotazione di sé stessa. I caratteri ripetuti non cambiano la regola, anche se possono far sì che più posizioni producano lo stesso risultato visibile. Questa verifica è più rigorosa del controllo di due anagrammi. Gli anagrammi possono riordinare liberamente i caratteri, mentre le rotazioni ne conservano l’ordine lungo il ciclo. Il confronto è inoltre letterale e distingue maiuscole e minuscole. Spazi, punteggiatura, caratteri combinati e interruzioni di riga partecipano al confronto. Inserisca il valore originale in `first` e quello candidato in `second`; il risultato contiene un solo valore booleano `is_rotation`.
Come viene eseguita la verifica
Lo strumento convalida innanzitutto che entrambi i campi siano stringhe e abbiano la stessa lunghezza. L’uguaglianza delle lunghezze è necessaria, perché una rotazione non inserisce né elimina caratteri. Se le lunghezze differiscono, la richiesta viene respinta come input non valido: in questo modo si distingue un confronto malformato da una candidata legittima di pari lunghezza che semplicemente non è una rotazione. Per gli input validi, l’implementazione cerca la candidata durante due passaggi consecutivi sulla stringa originale. Ogni possibile rotazione deve comparire in questo spazio di ricerca circolare. Una tabella dei prefissi evita di ricominciare dal carattere successivo dopo ogni corrispondenza parziale fallita, garantendo un comportamento lineare e deterministico rispetto alla lunghezza. Non vengono usati servizi di rete, modelli linguistici o regole locali e il testo non viene normalizzato. La stessa sequenza di unità di codice restituisce quindi sempre la medesima risposta. Due stringhe vuote sono rotazioni reciproche e due stringhe identiche soddisfano il caso valido dello spostamento nullo.
Interpretare i risultati e preparare l’input
Il risultato `true` significa che esiste almeno uno spostamento circolare di `first` il cui valore completo coincide con `second`. Il risultato `false` indica che le stringhe hanno la stessa lunghezza, ma nessuno spostamento produce una corrispondenza esatta. Prima di confrontare testi provenienti da fonti diverse, valuti se il confronto letterale rappresenta davvero il problema da risolvere. Questa capacità non elimina gli spazi, non uniforma maiuscole e minuscole, non rimuove la punteggiatura e non applica la normalizzazione Unicode, perché tali trasformazioni cambierebbero silenziosamente le stringhe fornite. Se l’applicazione considera equivalenti “A” e “a”, oppure tratta allo stesso modo le forme Unicode composte e scomposte, normalizzi entrambi i valori in modo coerente prima dell’invio. Conservi gli spazi iniziali o finali quando fanno parte di identificatori o sequenze codificate. Il prezzo base dell’API è $0.002 per richiesta, mentre la versione browser esegue localmente la stessa logica deterministica. Nei test includa rotazioni positive, casi negativi di pari lunghezza, caratteri ripetuti, stringhe identiche e l’errore per lunghezze diverse.
Casi d'uso
Convalidare l’output di un buffer circolare
Confermi che un buffer acquisito contenga la sequenza prevista anche quando la lettura è iniziata in un altro punto del ciclo.
Verificare esercizi di programmazione
Controlli le risposte ai problemi di rotazione senza confondere l’ordine circolare con il confronto libero degli anagrammi.
Confrontare identificatori ciclici
Stabilisca se due rappresentazioni di pari lunghezza descrivono lo stesso ciclo ripetuto da punti iniziali differenti.
Domande frequenti
Una stringa invariata conta come rotazione?
Sì. È ammessa una rotazione di zero posizioni, quindi ogni stringa è una rotazione di sé stessa.
Maiuscole e minuscole sono considerate uguali?
No. Il confronto è esatto e sensibile alle maiuscole, quindi le rispettive unità di codice sono differenti.
Che cosa accade con lunghezze diverse?
La capacità restituisce un errore di input non valido, perché una rotazione non può cambiare il numero di caratteri.
Una rotazione di stringa equivale a un anagramma?
No. Una rotazione conserva l’ordine circolare, mentre un anagramma può riordinare liberamente i caratteri.
Le stringhe vuote contano come rotazioni?
Sì. Due stringhe vuote hanno la stessa lunghezza e coincidono con una rotazione di zero posizioni.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo 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)Esempio di richiesta
{
"first": "waterbottle",
"second": "erbottlewat"
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.string_rotation_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_tokens | 20000 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |