C++で文字列がaⁿbⁿパターンに一致するかどうかを判定する方法
この問題では、「a」と「b」の2種類の文字のみで構成された文字列が与えられます。その文字列が anbn の形式、つまり「n個のa」の後に「n個のb」が続く形になっているかどうかを判定します。条件を満たす場合は1を、満たさない場合は0を返します。
例えば、入力が「aaaaaaaaaaaabbbbbbbbbbbb」の場合、aが12個、その後にbが12個続いているため、出力は1(true)となります。
解決のためのアプローチ
この問題は、以下の手順で解決できます。
- まず、入力文字列の長さを取得します。
- 先頭から順に文字を走査し、文字が「a」である限りループを続けます。「a」以外の文字が出現した時点でループを抜けます。このときのインデックスiは「a」の個数を表します。
- i × 2 が文字列全体の長さと等しくない場合、aとbの個数が一致しないため false を返します。
- 位置iから文字列の末尾まで走査し、すべての文字が「b」であることを確認します。途中で「b」以外の文字が見つかった場合は false を返します。
- すべてのチェックを通過できれば true を返します。
C++での実装例
理解を深めるために、以下の実装例を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
bool solve(string input_string) {
int length = input_string.length();
int i;
for (i = 0; i < length; i++)
if (input_string[i] != 'a')
break;
if (i * 2 != length)
return false;
for (int j = i; j < length; j++)
if (input_string[j] != 'b')
return false;
return true;
}
int main() {
string input_string = "aaaaaaaaaaaabbbbbbbbbbbb";
cout << solve(input_string) << endl;
return 0;
}
入力
"aaaaaaaaaaaabbbbbbbbbbbb"
出力
1
その他の入力例と判定結果
- 「aabb」→ 1(aが2個、その後にbが2個)
- 「aaab」→ 0(aとbの個数が一致しない)
- 「abab」→ 0(bの後にaが出現している)
- 「aaa」→ 0(bが存在しない)
計算量について
このアルゴリズムは文字列を最大2回走査するだけで済むため、時間計算量はO(n)、追加のメモリを使用しないため空間計算量はO(1)と非常に効率的です。スタックや正規表現を使わずに、シンプルな線形走査でanbnパターンの判定が可能です。
-
与えられた文字列が「悪い」かどうかを判定するC++プログラム
問題概要n 文字からなる文字列 S が与えられます。S には小文字の英字と「)」という文字が含まれています。この文字列が悪い(bad)と判定されるのは、末尾に連続する「)」の数が、それ以外の残りの文字数よりも厳密に多い場合です。ここでは、与えられた文字列 S が悪いかどうかをチェックするプログラムを作成します。たとえば、入力が S = fega)))))) の場合、出力は True になります。なぜなら、この文字列には英字が4文字しかないのに対し、「)」が6個あるためです。解法のアプローチこの問題は、以下の手順で効率的に解くことができます。カウンタ変数 ans を 0 で初期化します。文字列の
-
C++で二分木が同型(アイソモーフィック)かどうかを判定する方法
二分木では、各ノードが「左の子」と「右の子」という2つの子ノードを持ちます。ここでは、2つの二分木が与えられたとき、一方の木を左右反転(フリップ)することでもう一方の木が得られるかどうかを判定する問題を解説します。一方の木を反転することでもう一方の木と同じ構造が得られる場合、その2つの木は「同型(アイソモーフィック)」であると定義されます。具体例入力1出力Isomorphic(同型)説明:Tree-2はTree-1を左右反転することで得られるため、この2つの木は同型です。解き方のアプローチこの問題は再帰的なアプローチで効率的に解くことができます。ブール型の関数を用意し、両方の木のルートノードを