C++で2つの文字列をマージして最大の文字列を作成する方法
2つの文字列「a」と「b」、および結果を格納するための文字列「merge」が与えられているとします。この課題は、次のルールに従って「a」と「b」から1文字ずつ取り出し、「merge」を埋めていくことです。
- 文字列「a」が空でない場合、「a」の先頭の1文字を取り除き、その文字を「merge」に追加します。
- 文字列「b」が空でない場合、「b」の先頭の1文字を取り除き、その文字を「merge」に追加します。
- 両方の文字列が空でない場合は、それぞれの残りの文字列を辞書順に比較し、より大きい方の先頭文字を「merge」へ移します。たとえば「a」が「b」より大きい場合は、先に「a」から文字を取り出します。
- どちらかの文字列が空になるまで操作を繰り返し、完成した文字列「merge」を返します。
入力例と出力例
入力:
a = "bacaa"
b = "abcaa"
出力:
bacabcaaaa
解説:
最初の比較では、文字列「a」(bacaa)が文字列「b」(abcaa)よりも辞書順で大きいため、「a」の先頭文字「b」を取り出します。以降も同様に、毎回残りの文字列同士を比較して大きい方の先頭文字を「merge」に移していくことで、最終的に「bacabcaaaa」という辞書順で最大のマージ文字列が得られます。
この問題を解くためのアプローチ
この問題は再帰を使うことで簡潔に解くことができます。各ステップで文字列「a」と「b」の残り部分を辞書順に比較し、大きい方(または等しい場合)の先頭の1文字を「merge」に連結していきます。ここでのポイントは、先頭の1文字だけでなく「残りの文字列全体」を比較対象にすることです。こうすることで、同じ文字が続くケースでも、その後の並びまで見て常に最適な選択ができるようになります。
- 2つの入力文字列「a」と「b」を受け取ります。
- 再帰関数 concatenateLargest(string a, string b) は、2つの文字列を引数として受け取り、マージ後の最大の文字列を返します。
- 両方の文字列が空の場合は、a + b を返して再帰を終了します。
- 文字列「a」が「b」以下の場合は、「b」の先頭文字を結果に連結し、残りの「b」を引数として自分自身を再帰呼び出しします。
- 文字列「a」が「b」より大きい場合は、「a」の先頭文字を結果に連結し、残りの「a」を引数として再帰呼び出しします。
- すべての文字を処理し終えたら、連結された文字列を返します。
C++による実装例
#include <bits/stdc++.h>
using namespace std;
string concatenateLargest(string a, string b) {
if (a.size() == 0 || b.size() == 0) {
return (a + b);
}
if (a <= b)
return b[0] + concatenateLargest(a, b.substr(1));
else
return a[0] + concatenateLargest(a.substr(1), b);
}
int main() {
string a = "bacaa";
string b = "abcaa";
cout << concatenateLargest(a, b) << endl;
return 0;
}
上記のコードを実行すると、次の出力が得られます。
出力
bacabcaaaa
2つの文字列「bacaa」と「abcaa」は、このアルゴリズムに従ってマージすると「bacabcaaaa」になります。各ステップで残りの文字列全体を辞書順に比較することで、常に最適な文字を選択できているのがポイントです。
-
C++で2つの2進数文字列を加算するプログラムの書き方
2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁
-
C++で2つの二分木をマージする方法
2つの二分木があるとします。一方の木をもう一方の木に重ねてみると、一部のノードは互いに重なり合い、残りのノードは重ならない状態になります。ここで、この2つの木を1つの新しい二分木へマージすることを考えます。マージのルールは次のとおりです。2つのノードが重なっている場合は、それらの値を合計したものをマージ後のノードの新しい値とします。どちらか一方しかノードが存在しない場合は、空でない方のノードをそのまま新しい木のノードとして使用します。たとえば、次のような2つの木が与えられたとします。このときの出力結果は以下のようになります。解法のアプローチこの問題を解くために、以下の手順に従います。メソッド名