文字列のローテーション判定
文字列のローテーションとは、文字の循環順序を保ったまま、先頭の一部を末尾へ移すことです。末尾の一部を先頭へ移す操作として考えることもできます。このツールは2つの文字列を比較し、2番目の文字列が1番目を任意の位置数だけ回転して得られるかを判定します。移動しない場合も有効です。大文字と小文字、空白、句読点、Unicode文字をすべて区別して完全一致を確認します。回転によって文字が増減することはないため、長さが異なる入力には偽ではなく明確な検証エラーを返します。
無料で実行
文字列のローテーションに該当する条件
ローテーションでは、文字列内の文字が作る循環順序を変えずに、開始位置だけを移します。たとえば「waterbottle」の先頭3文字を末尾へ移すと「erbottlewat」になります。候補には同じ文字が同じ循環順序で並び、末尾と先頭の境界だけが変わっています。0文字分の移動も有効なので、どの文字列もそれ自身のローテーションです。同じ文字が繰り返されている場合、複数の回転位置から同一の表示結果が得られることがありますが、判定規則は変わりません。この検査はアナグラム判定より厳密です。アナグラムでは文字を自由に並べ替えられますが、ローテーションでは円環上の順序を維持する必要があります。また、照合では大文字と小文字を区別し、入力をそのまま比較します。空白、句読点、結合文字、改行も判定対象です。元の値を `first`、候補を `second` に指定してください。結果は1つの真偽値 `is_rotation` として返されます。
判定処理の仕組み
最初に、両方のフィールドが文字列であり、長さが等しいことを検証します。ローテーションでは文字を追加も削除もしないため、同じ長さであることが必須条件です。長さが異なる場合は、不正な入力としてリクエストを拒否します。これにより、形式が誤った比較と、長さは正しいもののローテーションではない候補を明確に区別できます。有効な入力では、元の文字列を連続して2周する探索範囲の中から候補を検索します。成立するローテーションは必ずこの循環探索範囲に現れます。部分一致の後で不一致になった際に毎回次の文字からやり直さないよう、接頭辞表を利用します。そのため、入力長に対して決定的な線形動作になります。ネットワークサービス、言語モデル、地域規則は利用せず、文字列の正規化も行いません。同じコード単位列には常に同じ結果を返します。2つの空文字列は互いにローテーションであり、同一の空でない文字列も0位置回転として有効です。
結果の読み方と入力の準備
`true` は、`first` を循環移動した結果の少なくとも1つが `second` と完全に一致することを示します。`false` は、文字列の長さは同じでも、どの移動位置でも完全一致しないことを示します。異なる情報源のテキストを比較する前に、完全一致が目的に適しているかをご確認ください。この機能は、空白の削除、大文字と小文字の統一、句読点の除去、Unicode正規化を行いません。これらを自動適用すると、指定された文字列を意図せず変更するためです。アプリケーションで「A」と「a」を同一とみなす場合や、Unicodeの合成形と分解形を同一視する場合は、送信前に両方の値を同じ方法で正規化してください。識別子や符号化列の一部である先頭・末尾の空白は保持してください。APIの基本料金は1リクエストあたり $0.002 で、ブラウザー版では同じ決定的ロジックをローカル実行できます。自動テストには、成立例、同じ長さの不成立例、反復文字、同一文字列、長さ違いのエラーを含めることをおすすめします。
活用例
リングバッファー出力の検証
読み取り開始位置が周期内で異なっていても、取得したバッファーに想定の並びが含まれるか確認できます。
プログラミング課題のテスト
循環順序と自由なアナグラム配置を混同せず、ローテーション問題の期待解を確認できます。
循環識別子の比較
同じ長さの2つの表現が、開始点だけの異なる同一の反復周期を表すか判定できます。
よくある質問
変化していない文字列もローテーションですか?
はい。0位置の移動が認められるため、すべての文字列はそれ自身のローテーションです。
大文字と小文字は同じものとして扱われますか?
いいえ。完全一致で大文字と小文字を区別するため、それぞれ異なるコード単位として扱います。
文字列の長さが異なる場合はどうなりますか?
ローテーションでは文字数を変更できないため、不正な入力としてエラーを返します。
文字列のローテーションはアナグラムと同じですか?
いいえ。ローテーションは循環順序を維持しますが、アナグラムでは文字を自由に並べ替えられます。
空文字列もローテーションとして扱われますか?
はい。2つの空文字列は長さが等しく、0位置の回転で一致します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
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)リクエスト例
{
"first": "waterbottle",
"second": "erbottlewat"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.string_rotation_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_tokens | 20000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |