Verificar rotação de strings
Uma rotação de string mantém todos os caracteres na mesma ordem circular, mas move um prefixo do início para o fim ou, de modo equivalente, um sufixo para o início.
Executar grátis
Este verificador compara duas strings e informa se a segunda pode ser obtida pela rotação da primeira em qualquer número de posições, inclusive zero. A correspondência é exata, portanto maiúsculas, espaços, pontuação e caracteres Unicode continuam relevantes. Como uma rotação não adiciona nem remove caracteres, comprimentos diferentes geram um erro de validação claro, e não um resultado negativo.
O que é considerado uma rotação de string
Uma rotação muda o ponto inicial de uma string sem alterar a sequência circular de seus caracteres. Por exemplo, ao girar “waterbottle” e mover os três primeiros caracteres para o fim, obtém-se “erbottlewat”. A candidata usa exatamente os mesmos caracteres e mantém a mesma ordem cíclica; somente a fronteira entre o fim e o início mudou. Uma rotação de zero posições é válida, portanto qualquer string é sempre uma rotação de si mesma. Caracteres repetidos não alteram essa regra, embora possam fazer várias posições de rotação produzirem o mesmo resultado visível. Esta verificação é mais rigorosa do que testar se duas strings são anagramas. Anagramas podem reorganizar os caracteres livremente, enquanto rotações preservam a ordem ao redor do ciclo. A correspondência também diferencia maiúsculas de minúsculas e é literal. Espaços, pontuação, caracteres combinados e quebras de linha fazem parte da comparação. Informe o valor original em `first` e a candidata em `second`; o resultado contém um único booleano `is_rotation`.
Como a verificação funciona
O verificador primeiro confirma que os dois campos são strings e têm o mesmo comprimento. Essa igualdade é uma condição necessária, pois uma rotação nunca insere nem exclui caracteres. Se os comprimentos forem diferentes, a solicitação será rejeitada como entrada inválida, permitindo distinguir uma comparação malformada de uma candidata legítima de mesmo comprimento que simplesmente não é uma rotação. Para entradas válidas, a implementação procura a candidata em duas passagens consecutivas pela string original. Toda rotação precisa aparecer nesse espaço circular de busca. O algoritmo usa uma tabela de prefixos para evitar reiniciar no caractere seguinte depois de cada incompatibilidade parcial, oferecendo comportamento linear e determinístico em relação ao tamanho da entrada. Ele não chama serviços de rede, não usa modelo de linguagem, não consulta regras regionais e não normaliza o texto. Assim, a mesma sequência de unidades de código sempre retorna a mesma resposta. Duas strings vazias são rotações entre si, e strings idênticas atendem ao caso válido de rotação de zero posições.
Como interpretar resultados e preparar a entrada
Um resultado `true` significa que existe pelo menos um deslocamento circular de `first` cujo valor completo é igual a `second`. Um resultado `false` significa que as strings têm o mesmo comprimento, mas nenhum deslocamento produz uma correspondência exata. Antes de comparar textos de fontes diferentes, decida se a correspondência literal representa corretamente o problema que você precisa resolver. Esta capacidade não remove espaços, não iguala maiúsculas e minúsculas, não elimina pontuação e não aplica normalização Unicode, pois essas transformações alterariam silenciosamente as strings fornecidas. Se seu aplicativo considerar “A” e “a” equivalentes, ou tratar formas Unicode compostas e decompostas como iguais, normalize os dois valores de maneira consistente antes do envio. Preserve espaços iniciais ou finais quando fizerem parte de identificadores ou sequências codificadas. O preço-base da API é US$ 0,002 por solicitação, enquanto a versão para navegador pode executar localmente a mesma lógica determinística. Em testes automatizados, inclua rotações positivas, comparações negativas de mesmo comprimento, caracteres repetidos, strings idênticas e o erro de comprimentos diferentes.
Casos de uso
Validar a saída de um buffer circular
Confirme se um buffer capturado contém a sequência esperada, mesmo quando a leitura começou em outra posição do ciclo.
Testar exercícios de programação
Confira respostas esperadas para problemas de rotação sem confundir ordem circular com correspondência irrestrita de anagramas.
Comparar identificadores cíclicos
Determine se duas representações de mesmo comprimento descrevem o mesmo ciclo repetitivo com pontos iniciais diferentes.
Perguntas frequentes
Uma string inalterada conta como rotação?
Sim. A rotação de zero posições é permitida, portanto toda string é uma rotação de si mesma.
Letras maiúsculas e minúsculas são tratadas como iguais?
Não. A comparação é exata e diferencia maiúsculas de minúsculas, portanto suas unidades de código são distintas.
O que acontece quando as strings têm comprimentos diferentes?
A capacidade retorna um erro de entrada inválida, pois uma rotação não pode alterar a quantidade de caracteres.
Rotação de string é o mesmo que anagrama?
Não. Uma rotação preserva a ordem circular, enquanto um anagrama pode reorganizar os caracteres livremente.
Strings vazias contam como rotações?
Sim. Duas strings vazias têm o mesmo comprimento e correspondem pela rotação de zero posições.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"first": "waterbottle",
"second": "erbottlewat"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.string_rotation_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_tokens | 20000 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |