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

与えられた文字列が「悪い」かどうかを判定するC++プログラム

問題概要

n 文字からなる文字列 S が与えられます。S には小文字の英字と「)」という文字が含まれています。この文字列が悪い(bad)と判定されるのは、末尾に連続する「)」の数が、それ以外の残りの文字数よりも厳密に多い場合です。ここでは、与えられた文字列 S が悪いかどうかをチェックするプログラムを作成します。

たとえば、入力が S = "fega))))))" の場合、出力は True になります。なぜなら、この文字列には英字が4文字しかないのに対し、「)」が6個あるためです。

解法のアプローチ

この問題は、以下の手順で効率的に解くことができます。

  1. カウンタ変数 ans を 0 で初期化します。
  2. 文字列の長さを n とし、インデックス i を末尾( n - 1 )からスタートさせます。
  3. i が 0 以上で、かつ S[i] が「)」である限り、i を減らしていきます。これにより、末尾に連続する「)」の個数を特定できます。
  4. 末尾の「)」の数を z = n - 1 - i として計算します。
  5. ans = 2 * z - n を計算します。この値が正であれば、「)」の数がそれ以外の文字数を上回っていることを意味します。
  6. 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) となります。非常にシンプルかつ効率的な解法と言えるでしょう。

  1. C++で有向グラフの強連結成分を検出するプログラムの作成方法

    有向グラフにおいて、ある成分内の任意の頂点ペア同士の間に経路が存在するとき、その成分は「強く接続されている(強連結)」といいます。このような成分のことを強連結成分(SCC: Strongly Connected Components)と呼びます。この問題を解くには、まずDFS(深さ優先探索)を使って各頂点の完了時刻(finish time)を求めます。次にグラフを転置し、完了時刻をもとに頂点を降順に並べる(トポロジカルソート)ことで、強連結成分を一つずつ取り出します。これは有名なKosarajuのアルゴリズムに基づいた手法です。入力: グラフの隣接行列001101000001000000010

  2. 指定された文字列がキーワードであるかどうかを確認するPythonプログラム

    この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ