C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】文字列を括弧で囲んだ部分文字列の全パターンを出力する方法

この問題では、与えられた文字列を部分文字列に分割し、それぞれを括弧で囲んで出力する必要があります。

まず、具体例を見ながら問題を理解しましょう。

入力 : wxyz
出力 :
    (w) (x) (y) (z)
    (w) (x) (yz)
    (w) (xy) (z)
    (w) (xyz)
    (wx) (y) (z)
    (wx) (yz)
    (wxy) (z)
    (wxyz)

解説 − 文字列を考えられるすべての部分文字列の組み合わせに分割し、それぞれの部分文字列を括弧で囲んで表示します。長さ n の文字列の場合、分割パターンは 2n-1 通り存在します。

問題の内容が理解できたところで、解決策を作成していきましょう。

ここでは再帰を使ってこの問題を解きます。再帰関数には2つのパラメータを渡します。1つは現在処理中の位置を示すインデックス、もう1つはこれまでに構築した出力文字列です。未処理の部分文字列は再帰の各呼び出しで少しずつ処理され、すべての分割パターンが生成されていきます。

実装例

この問題を解くプログラムは以下のとおりです。

#include <iostream>
using namespace std;

void substring(string str, int index, string out){
    // 文字列の終端に到達したら、完成したパターンを出力
    if (index == str.length()){
        cout << out << endl;
        return;
    }
    // index 以降の各位置で文字列を分割しながら再帰呼び出し
    for (int i = index; i < str.length(); i++)
        substring(str, i + 1, out + "(" + str.substr(index, i + 1 - index) + ")");
}

int main(){
    string str = "wxyz";
    cout << "部分文字列のパターン :" << endl;
    substring(str, 0, "");
    return 0;
}

出力

部分文字列のパターン :
(w)(x)(y)(z)
(w)(x)(yz)
(w)(xy)(z)
(w)(xyz)
(wx)(y)(z)
(wx)(yz)
(wxy)(z)
(wxyz)

アルゴリズムのポイント

この再帰の仕組みを簡単に整理すると、次のようになります。

  • 関数は現在のインデックスから文字列の終わりまでの各位置 i について、index から i までの部分文字列を切り出し、括弧で囲んで出力文字列に追加します。
  • その後、インデックスを i + 1 に進めて再帰呼び出しを行うことで、残りの文字列に対するすべての分割パターンを探索します。
  • インデックスが文字列の長さに達した時点で、1つの完全なパターンが完成したことになるため、それを出力して再帰を終了します。

計算量は、長さ n の文字列に対して 2n-1 通りのパターンが生成されるため、時間計算量は O(2n × n) となります。文字列が長くなるとパターン数が爆発的に増えるため、短い文字列向けのアルゴリズムである点に注意してください。

  1. C++で文字列のすべての部分文字列を出力するプログラムの解説

    はじめにこの記事では、与えられた文字列からすべての部分文字列を取り出して出力するC++プログラムについて解説します。文字列(char型配列)が1つ与えられ、その文字列から生成できるすべての部分文字列を順番に画面へ表示するのが本プログラムの目的です。部分文字列とは部分文字列とは、元の文字列から連続する文字を取り出して作られる文字列のことです。例えば「abca」という文字列の場合、「a」「b」「ab」「bca」「abca」などがすべて部分文字列に該当します。長さnの文字列からは、長さ1の部分文字列がn個、長さ2のものがn-1個、長さ3のものがn-2個…と続くため、部分文字列の総数は n×(n+1)

  2. C++でマトリックス(行列)をZ字形に出力する方法を解説

    この記事では、マトリックス(2次元配列)の要素をZ字形の順序で出力する方法を解説します。Z字形の出力とは、まず1行目を左から右へ、次に右から左への対角線上の要素、最後に最終行を左から右へと出力することで、文字どおり「Z」の形に沿って要素をたどる手法です。例として、次のような4×4の行列を考えてみましょう。5 8 7 1 2 3 6 4 1 7 8 9 4 8 1 5この行列をZ字形で出力すると、結果は以下のようになります。5 8 7 1 6 7 4 8 1 5アルゴリズムの考え方処理の手順はシンプルで、次の3つのステップで構成されます。1行目のすべての要素を左から右へ出力する。対角線上の要素を