繰り返し部分文字列パターン検出
文字列が同じ断片を何度も並べただけかどうかが分かります。ababab は ab の3回、aaaa は a の4回で、aba は繰り返しではありません。最小の単位と正確な回数を返します。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- テキスト
- ababab
- 長さの単位
- 2
- 数量
- 3
- 長さ
- 6
面接問題やデータクレンジングの確認では、この文字列は短い断片を何度も並べただけか、という単純な問いがよく出ます。ababab、aaaa、xyzxyzxyz のような文字列はそのようにできており、abc や aba はそうではありません。ネットワーク呼び出し、乱数、時計への依存はなく、バイト単位で再実行できる文字列演算だけです。
繰り返し部分文字列パターンとは何か、単位の選び方
文字列に繰り返し部分文字列パターンがあるとは、空でない単位を端から端まで少なくとも 2 回並べ、余り文字がない場合をいいます。たとえば ababab は単位 ab を 3 回、aaaa は単位 a を 4 回、xyzxyz は単位 xyz を 2 回並べたものです。検出器は常にそのような最小の単位を返します。
文字列が ab でも abab でも敷き詰められるなら、答えは回数の多い ab であり、長い候補ではありません。より短い単位で全長を敷き詰められない場合、繰り返しなしと報告されます。unit は元のテキストと等しく、count は 1 です。
古典的な線形時間判定は長さ n の文字列について KMP の最長固有接頭辞・接尾辞表を構築し、period を n から最終ボーダー長を引いた値とし、period が n を割り切りかつ n より真に小さいかを調べます。両方成り立てば、単位は長さ period の接頭辞で、回数は n を period で割った値です。
これは 1 から n の半分の床まで各長さを試す総当たりの約数走査と一致しますが、計算量は O(n) のままで、浮動する時計や乱数シードには依存しません。1 文字の文字列と検証の空結果は明示的に扱います。長さ 1 は非自明な繰り返しになり得ず、空または欠落した text は LPS 作業の前に拒否されます。
繰り返しパターン検出器が役立つ場面
面接対策とアルゴリズム講座では、ボーダー、周期、約数の議論を教えるためにこの問題を使い、ライブ検出器があれば学生は時間圧の下で LPS 表を手書きせずに ababab と aba を確認できます。教員と LMS 作者には、パターンの真偽フラグと具体的な単位の両方を返す決定的オラクルが必要で、自動採点は同じ最小断片を名指す正しい説明を受け入れられます。
データ品質パイプラインは、検索インデックスや分析を汚染する前に、誤ってコピー&ペーストした繰り返しに見える列(SKU SKU SKU、yesyesyes)を印付けます。圧縮や符号化のデモは、完全な圧縮器だと主張せずランレングス風の構造を示し、xyzxyzxyz が xyz の 3 コピーだと示すだけで講義スライドに足りることが多いです。
検証失敗は残高を消費しません。
活用例
面接とアルゴリズム練習
文字列が非自明な繰り返しパターンかどうかを確認し、教科書の KMP と約数解法に照らして最小単位と回数を名付けます。
データ品質と重複貼り付けの検査
より短い断片の純粋な繰り返しであるセルやトークンを、インデックス、カタログ、分析に入る前に印付けます。
よくある質問
繰り返し部分文字列パターンをどう検出しますか?
非自明な繰り返しでない場合、unit は全文で count は 1 です。
最小の繰り返し単位とは何ですか?
余りなく全体を敷き詰める、最短の空でない接頭辞です。ababab では単位は ab(abab ではない)です。aaaa では単位は a です。
検出器はどのアルゴリズムを使いますか?
KMP の最長固有接頭辞・接尾辞(LPS)周期判定です。period = n - lps[n-1] が n を割り切り n より短いなら、単位はその長さの接頭辞です。各約数長を試すのと同等ですが線形時間です。
繰り返しでない文字列ではどうなりますか?
エラーではなく通常の結果が返ります。繰り返しではないと示され、単位は文字列全体、回数は1になります。abc のような一般的な文字列も同じ扱いです。
単位は文字列全体を埋める必要がありますか?
はい。単位を2回以上続けて並べたときに、余りの文字なしで文字列全体と一致する場合だけ繰り返しと見なします。そのため aba は、最初と最後が a でも繰り返しではありません。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev/repeated-substring \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"ababab"}'const res = await fetch("https://api.kit.forhosting.com/dev/repeated-substring", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "ababab"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/repeated-substring",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "ababab"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/repeated-substring", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"ababab"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"ababab"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/repeated-substring", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "ababab"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.repeated_substring",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
この繰り返し部分文字列パターン検出器は、空でない単一の text フィールドを受け取り、決定的な KMP ボーダー(最長固有接頭辞・接尾辞)解析を実行し、最小の繰り返し単位と正確な繰り返し回数を返します。より短い単位で全体を敷き詰められない場合、応答は is_repeated を false にし、unit を全文に、count を 1 に設定し、呼び出し側が常に安定した契約を得られるようにします。
繰り返し部分文字列パターンとは何か、単位の選び方
この契約は、非パターンを硬いエラーにするよりパイプラインに優しく、呼び出し側は通常の一意な文字列を invalid_input 扱いせずに is_repeated で分岐できます。
入力契約、応答フィールド、エラーの振る舞い
有限の数値と bigint はまず文字列化されるため、素の数値として打った商品コードもきれいに解析されます。例:aaaa は unit a、count 4 です。入力は文書化された文字数上限内に保ってください。過大な貼り付けは、黙って切り詰められるのではなく、明示的な上限メッセージで失敗します。空でない文字列を持つ必須の text フィールドを含む JSON 本体を POST してください。input、string、value、s、source の別名を受け入れるため、クエリフォーム、表計算、型付き SDK ラッパーが列名を変えずに同じ契約を再利用できます。真偽値、平易なオブジェクト、配列は拒否され、誤った JSON 本体が単語 true や役に立たないオブジェクトダンプになることはありません。空文字列と欠落した text は invalid_input で失敗し、課金されません。成功時の本体には、解析した文字列のエコーである text、count が少なくとも 2 のとき true の is_repeated、最小の繰り返し断片(繰り返さないときは全文)である unit、unit_length、count、元テキストの length、ログと複数ツールのパイプライン向けに kmp_period に固定された method が含まれます。例:ababab は unit ab、unit_length 2、count 3、is_repeated true を返します。例:abc は unit abc、count 1、is_repeated false です。同一の単位と回数が CI、採点スクリプト、エッジワーカーで必要なときは、このページの無料ブラウザ実行と有料 API を組み合わせ、KMP を自分で再実装せずに済みます。
繰り返しパターン検出器が役立つ場面
実装が純粋 parse の tier A であるため、成功した呼び出しはすべて公開の基本価格 $0.002 で、モデルのトークンも外向きネットワークもありません。リクエストを小さく保ち、テストで unit と count を固定すれば、宿題、CI フィクスチャ、エッジワーカー向けに再現可能な答えが得られ、汎用の文字列代数スタックを自ら立てる必要はありません。
連携の活用例
LMS と宿題の自動採点
unit、count、is_repeated を返す決定的オラクルで、繰り返し部分文字列の設問を安定比較により採点します。
技術的な質問
文字列が繰り返されていない場合は?
呼び出しは成功したままです。is_repeated は false、unit は元のテキストと等しく、count は 1 です。欠落または空の text だけが invalid_input です。
繰り返し部分文字列パターン検出器の料金は?
ブラウザツールは無料です。API リクエストは成功呼び出しごとに前払い KIT 残高の $0.002 を使い、無効な入力は課金されません。