-
C++で行列の左上から右下へのすべての回文パスを出力する方法
この問題では、小文字のアルファベットのみで構成された行列が与えられ、その行列の左上から右下までのすべての回文パスを見つけて出力することが求められます。移動として許可されているのは右方向と下方向のみで、斜め移動は認められていません。問題の例具体例を使って問題を理解しましょう。入力: matrix[][] = { {xxxy, yxxx, xyyx} 出力: xxxxxx, xxxxxx, xyxxyx解説左上から右下へのすべての有効な移動経路を、セルの位置 i を使って確認してみましょう。i00 -> i01 -> i02 -> i03 -> i1
-
C++で文字列のすべての回文分割(パリンドロームパーティション)を出力する方法
問題の概要この問題では、回文(パリンドローム)となる文字列が与えられ、その文字列を切り分けることで得られるすべての可能な回文分割(パーティション)を出力する必要があります。具体例を見てみましょう。入力: string = ababa出力: ababa、a bab a、a b a b a などこのように、同じ文字列でも切り分け方によって複数の回文分割パターンが存在します。解決のアプローチこの問題を解く基本的な考え方は、文字列の各部分文字列が回文であるかどうかを順番にチェックすることです。部分文字列が回文であれば、それを現在の分割リストに追加し、残りの部分に対して再帰的に同じ処理を繰り返します。こ
-
【C++】文字列から作れるすべての回文順列を出力する方法
問題概要 この問題では、与えられた文字列を構成する文字を使って作成できるすべての回文(前から読んでも後ろから読んでも同じになる文字列)の順列をすべて出力します。 具体例で理解しよう 入力: string = aabb 出力: abba baab この問題を解くには、文字列の各文字を取り出し、それらを使って回文となる文字列を1つずつ生成していく必要があります。 解法アルゴリズム 以下の手順で回文順列を効率的に生成できます。 ステップ1: その文字列から回文が作れるかどうかを判定します。作れない場合は「Not Possible」を出力します。 ステップ2: 回文が作れる場合、文字列を半分に分
-
【C++】指定された合計値となるすべてのペアを出力する方法
問題概要 この問題では、整数の配列と目標となる合計値が与えられ、その合計値と等しくなるすべての整数ペアを見つけて出力する必要があります。 具体例を使って問題を理解してみましょう。 入力: array = {1, 6, -2, 3}、sum = 4 出力: (1, 3) 、(6, -2) つまり、指定された合計値を持つペアをすべて見つけ出すことが求められています。 解法1:ブルートフォース(全探索) 最もシンプルな解決策は、合計値を生成する要素のペアを一つずつ確認していく方法です。配列を走査し、各要素について合計値に一致する組み合わせとなる数を探すことで実装できます。 この方法は理解しやすい反面
-
C++で指定された合計値となるすべてのトリプレットを出力する方法
この問題では、重複のない整数の配列と合計値が与えられ、その合計値と等しくなる3つの要素の組み合わせ(トリプレット)をすべて見つける必要があります。まず、具体例を使って問題を確認してみましょう。入力 : array = {0 , 2 , -1 , 1, -2} Sum = 1 出力 : 1 2 -2 0 2 -1この問題を解くには、合計値に一致するすべてのトリプレットを見つけます。最もシンプルなアプローチは、3重ループを使ってすべての要素の組み合わせの合計を計算し、条件に合致するトリプレットを出力する方法です。方法1:3重ループによる全探索#include <iostream> us
-
【C++】ソート済み配列から等差数列(AP)を形成するすべてのトリプレットを出力する方法
この問題では、ソートされた数値の配列が与えられ、その中から等差数列(AP:Arithmetic Progression)を形成するトリプレット(3つの組)をすべて見つけ出します。 等差数列とは、隣り合う項同士の差(公差)が常に一定である数列のことです。 問題例 入力 :array = {2 , 5 , 7, 8 , 9 , 10}出力 :2 5 85 7 97 8 98 9 10 単純なアプローチ 最もシンプルな解決策は、三重のループを回してすべてのトリプレットを列挙し、それぞれが等差数列を成すかどうかを確認する方法です。しかし、この方法の計算量は O(n³) のオーダーとなり、配列のサイズが
-
C++で最も多く出現する合計ペアをすべて出力する方法
問題の概要この問題では、n個の一意な整数からなる配列が与えられます。その中から、配列内の2つの整数の和(ペアの合計値)を求め、その合計値が最大頻度で出現するものをすべて見つけて出力する必要があります。この問題には複数の解が存在する場合があり、該当するすべての解を出力しなければなりません。入力例と出力例入力 : array = { 1, 12, 5, 7, 9, 11}出力 : 16 12説明: 合計16と12は、それぞれ2回出現しています。5 + 11 = 16 & 7 + 9 = 161 + 11 = 12 & 5 + 7 = 12解決のアプローチこの問題を解くための基本的なアプローチは、す
-
C++で二分木における指定された合計を持つルートからのパスをすべて出力する方法
この問題では、二分木とある合計値 S が与えられます。求めるのは、ルート(根)から木の任意のノードまで辿ったとき、経路上のノード値の合計が指定された値と一致するようなパスです。条件を満たすパスは複数存在する場合があるため、該当するすべてのパスを出力します。 入力例 Sum = 14 Output : path : 4 10 4 3 7 解法のアプローチ この問題を解くには、二分木の先行順走査(プリオーダートラバーサル)を利用します。ルートから各ノードへ向かう途中で、それまでに通過したノード値の累積和(sum_so_far)を記録し、それが目的の合計と一致した時点で、そこまでのパスを出力します
-
C++で文字列のすべての回文順列をアルファベット順に出力する方法
問題の概要 この問題では、長さnの文字列が与えられます。その文字列に含まれる文字を使って生成できるすべての回文(パリンドローム)の順列を、アルファベット順(辞書順)に出力することが求められます。もし回文を構成できない場合は「-1」を出力してください。 具体例を見てみましょう。 入力:string = abcba出力:abcbabacab 「abcba」の場合、文字の出現頻度は a:2、b:2、c:1 となり、前半部分を「ab」「ba」と入れ替えた2つの回文が作れます。 解決のためのアプローチ この問題を解くには、まず作成可能なすべての回文を見つけ、それらを辞書順に並べ替える必要があります。よ
-
C++で配列内の正と負の整数ペアをすべて出力する効率的なアルゴリズム
問題の概要この問題では、重複しない整数からなる配列が与えられます。ここで求められるのは、配列内に存在する「正の整数」と「負の整数」のペア(絶対値が等しい組み合わせ)をすべて出力することです。まず、具体例を見ながら問題を理解しましょう。入力: array = {1, 4, 7, -1, 2, 5, -7} 出力: (-1, 1) (-7, 7)単純な解法とその課題最も簡単なアプローチは、二重ループを使って正負のペアを総当たりで探す方法です。しかし、この解法はコードが複雑になりやすく、時間計算量もO(n²)(nは配列のサイズ)となるため、配列が大きくなるほど実用的ではなくなります。効率的な解法:ソ
-
C++で木構造のノード数が奇数・偶数となるレベルをすべて出力する方法
この記事では、木(ツリー)構造が与えられたときに、各レベルに含まれるノードの数を調べ、その数が奇数であるレベルと偶数であるレベルをそれぞれ出力する方法を、C++のサンプルコード付きで解説します。 問題の概要 まず、具体的な例を使って概念を確認しましょう。次のような木構造を考えます。 出力: ノード数が奇数のレベル:1, 3, 4 ノード数が偶数のレベル:2 解説: 第1レベルにはノードが1個(奇数)、第2レベルには2個(偶数)、第3レベルには3個(奇数)、第4レベルには1個(奇数)存在します。そのため、奇数となるのは「1, 3, 4」のレベル、偶数となるのは「2」のレベルです。 解き方
-
C++で文字列内の重複文字とその出現回数を出力する方法
この問題では、与えられた文字列の中から重複しているすべての文字を検出し、それぞれの出現回数とともに出力する必要があります。問題の理解まず、具体例を使って問題を確認してみましょう。入力:TutorialsPoint 出力: t (3) o (2) i (2)解説:各文字の出現回数を数えると、以下のようになります。t → 3回u → 1回o → 2回r → 1回i → 2回a → 1回s → 1回n → 1回この結果から、出現回数が2回以上の文字(t、o、i)だけが出力対象となります。解決のアプローチこの問題を解くための手順は以下の通りです。文字列を先頭から走査し、各文字の出現回数をカウントしま
-
C++で無向グラフ内のすべてのサイクル(閉路)を検出して出力する方法
問題の概要 この記事では、無向グラフが与えられたときに、そのグラフ内に形成されるすべてのサイクル(閉路)を検出して出力する方法を解説します。 無向グラフとは、頂点同士が双方向で接続されているグラフのことです。すべての辺に方向がなく自由に行き来できるため、「無向ネットワーク」とも呼ばれます。 サイクル(閉路)とは、グラフデータ構造において、頂点の並びが一周して出発点に戻るような閉じた経路を形成しているものを指します。 まず、具体例を見て理解を深めましょう。 入力グラフ: 出力: Cycle 1: 2 3 4 5 Cycle 2: 6 7 8 この例では、頂点2〜5で構成されるサイクルと、頂点6
-
【C++】各要素の符号を変更して合計がMで割り切れるすべての組み合わせを出力する方法
この記事では、N個の要素からなる配列が与えられたとき、各要素に「+(プラス)」または「−(マイナス)」の符号を付けた合計値が、整数Mで割り切れるようなすべての組み合わせを出力するC++プログラムを解説します。問題の概要配列の各要素に対して符号を選ぶ自由度があるため、合計値の候補は複数存在します。その中から、Mで割り切れるものだけを符号付きで出力するのが本問題の目的です。入力 : array = {4, 7, 3} ; M = 3 出力 : - 4 + 7 - 3 (合計 = 0) - 4 + 7 + 3 (合計 = 6) + 4 - 7 - 3 (合計 = -6) + 4 - 7
-
C++で文字列の全組み合わせを辞書式順序に出力する方法
この記事では、与えられた文字列 str に含まれる文字の組み合わせをすべて抽出し、辞書式順序(lexicographical order)で出力する問題をC++で解説します。問題の概要具体例を見てみましょう。入力として文字列「XYZ」が与えられた場合、出力は次のようになります。Input: str = XYZ Output : X XY XYZ XZ XZY Y YX YXZ YZ YZX Z ZX ZXY ZY ZYXこのように、1文字から始まり、文字列の長さ分までのすべての組み合わせがアルファベット順に並んで出力されます。解決のアプローチこの問題を解くには、文字列中の文字の組み合わせをすべ
-
C++で文字列に変換せずに数値のすべての部分文字列を出力する方法
問題概要この問題では、整数 n が与えられます。その数値から作成できるすべての部分文字列(連続する桁の並び)を出力することが求められます。ただし、文字列への変換は禁止されているため、整数を文字列や配列に変換して処理することはできません。まず、具体例を見てみましょう。入力: number = 5678出力: 5, 56, 567, 5678, 6, 67, 678, 7, 78, 8ご覧のとおり、先頭の桁から始まるすべての連続部分列が出力されています。解決のアプローチこの問題を解くには、数学的なロジックを活用します。基本的な考え方は、最上位桁から順に出力し、その後、下位の桁についても同様の処理を
-
C++で配列から指定サイズのすべての部分集合(サブセット)を出力する方法
この記事では、与えられた配列から、指定されたサイズ r のすべての部分集合(サブセット)を生成して出力する方法を解説します。これは組み合わせ(コンビネーション)を求める古典的なアルゴリズム問題の一つです。問題の概要要素が n 個含まれる配列が与えられたとき、その配列の要素を使って作れる「サイズ r の組み合わせ」をすべて出力します。同じ組み合わせは一度だけ出力し、重複は除外する点に注意してください。入力例と出力例入力: array = {3, 5, 6} r = 2 出力: 3 5 3 6 5 6上記の例では、要素 {3, 5, 6} から 2 個を選ぶ組み合わせは 「{3, 5}」「{3,
-
文字列のすべてのサブシーケンス(部分列)を出力する3つの方法を解説
問題の概要この問題では、1つの文字列が与えられ、その文字列のすべての部分列(サブシーケンス)を出力することが求められます。部分列とは、元の文字列から一部の文字を削除して作られる文字列のことであり、文字の並び順を入れ替えることはできません。具体的な入出力例を見てみましょう。入力:xyz出力:x, y, z, xy, yz, xz, xyz解説:上記の例では、文字を削除するだけで部分列を生成しており、並べ替えは一切行っていません。たとえば「xz」は「xyz」から「y」を取り除いたものですが、「zx」のような順序の入れ替えは許されません。なお、長さnの文字列の部分列は(空文字列を含めれば)2n個存在
-
C++で母音で始まり子音で終わる文字列のすべての部分列を出力する方法
問題概要この問題では、与えられた文字列の中から、母音で始まり子音で終わる部分列をすべて見つけ出します。文字列とは、文字を要素とする配列のことです。ここで生成する部分列は、元の文字列からいくつかの文字を削除することで作成できます。ただし、文字の並び順は変更してはいけません。入力:abc 出力:ab, ac, abc解法のアプローチこの問題を解くには、文字列を先頭から走査し、母音の位置を固定したうえで、その後ろに続く並びを順番に確認していきます。以下に、解法のためのアルゴリズムを示します。アルゴリズムステップ1:変数 i を使い、文字列の各文字を先頭から順に走査します。 ステップ2:i 番目の文字
-
C++でArrayList(vector)を使って文字列のすべての部分列(サブシーケンス)を出力する方法
問題概要 この記事では、与えられた文字列のすべての部分列(サブシーケンス)を出力する方法を解説します。部分列とは、元の文字列から0個以上の文字を削除することで得られる文字列のことであり、残った文字同士の相対的な順序は変更してはいけません。 まず、具体例で問題を確認しましょう。 入力: string = xyz 出力: x y xy z xz yz xyz このように、元の順序を保ちながら、空でないすべての文字の組み合わせが出力されます。 解法のアプローチ すべての部分列を求める最も基本的な方法は再帰を利用することです。各文字に対して「部分列に含める」「含めない」という2つの選択肢を順に試すこ