与えられた文字列が「悪い」かどうかを判定するC++プログラム
問題概要
n 文字からなる文字列 S が与えられます。S には小文字の英字と「)」という文字が含まれています。この文字列が悪い(bad)と判定されるのは、末尾に連続する「)」の数が、それ以外の残りの文字数よりも厳密に多い場合です。ここでは、与えられた文字列 S が悪いかどうかをチェックするプログラムを作成します。
たとえば、入力が S = "fega))))))" の場合、出力は True になります。なぜなら、この文字列には英字が4文字しかないのに対し、「)」が6個あるためです。
解法のアプローチ
この問題は、以下の手順で効率的に解くことができます。
- カウンタ変数
ansを 0 で初期化します。 - 文字列の長さを
nとし、インデックスiを末尾(n - 1)からスタートさせます。 iが 0 以上で、かつS[i]が「)」である限り、iを減らしていきます。これにより、末尾に連続する「)」の個数を特定できます。- 末尾の「)」の数を
z = n - 1 - iとして計算します。 ans = 2 * z - nを計算します。この値が正であれば、「)」の数がそれ以外の文字数を上回っていることを意味します。ans > 0なら true を返し、そうでなければ false を返します。
C++による実装例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
bool solve(string S) {
int ans = 0;
int n = S.size();
int i = n - 1;
while (i >= 0 && S[i] == ')')
i--;
int z = n - 1 - i;
ans = 2 * z - n;
if (ans > 0)
return true;
else
return false;
}
int main() {
string S = "fega))))))";
cout << solve(S) << endl;
}
実行結果
入力:
"fega))))))"
出力:
1
出力が「1」となるのは、関数 solve() が true を返したことを意味します。つまり、文字列「fega))))))」は悪い(bad)文字列であると正しく判定されました。
計算量について
このアルゴリズムは、文字列を一度だけ後ろから走査するため、時間計算量は O(n)、追加のメモリ使用量は O(1) となります。非常にシンプルかつ効率的な解法と言えるでしょう。
-
C++で有向グラフの強連結成分を検出するプログラムの作成方法
有向グラフにおいて、ある成分内の任意の頂点ペア同士の間に経路が存在するとき、その成分は「強く接続されている(強連結)」といいます。このような成分のことを強連結成分(SCC: Strongly Connected Components)と呼びます。この問題を解くには、まずDFS(深さ優先探索)を使って各頂点の完了時刻(finish time)を求めます。次にグラフを転置し、完了時刻をもとに頂点を降順に並べる(トポロジカルソート)ことで、強連結成分を一つずつ取り出します。これは有名なKosarajuのアルゴリズムに基づいた手法です。入力: グラフの隣接行列001101000001000000010
-
指定された文字列がキーワードであるかどうかを確認するPythonプログラム
この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ