【C++】部分文字列「ab」をすべて削除した後に残る最終的な文字列を求める方法
はじめに
このチュートリアルでは、以下の問題を解いていきます。
a と b の文字のみで構成された文字列が与えられます。ここでのタスクは、文字列から部分文字列 ab を取り除き、最後に残った文字列を出力することです。
この問題を解くアイデアは非常にシンプルです。a と b だけで構成される文字列は、操作を繰り返すうちに必ず a だけの文字列か b だけの文字列へと縮んでいきます。なぜなら、部分文字列 ab を1つ削除するたびに、a と b が1個ずつ減っていくからです。
アルゴリズムの手順
文字列を初期化します。
a 用と b 用の2つのカウンタ変数を初期化します。
与えられた文字列を先頭から走査し、a と b の出現回数をそれぞれ数えます。
a と b の出現回数を比較します。
両者の差に相当する数だけ、多く残る側の文字を並べて出力します。
サンプルコード
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
string getTheUpdatedString(string str) {
int n = str.length();
int a_count = 0, b_count = 0;
for (int i = 0; i < n; i++) {
if (str[i] == 'a') {
a_count++;
}
else {
b_count++;
}
}
string updated_string = "";
if (a_count > b_count) {
for (int i = 0; i < a_count - b_count; i++) {
updated_string += "a";
}
}
else {
for (int i = 0; i < b_count - a_count; i++) {
updated_string += "b";
}
}
return updated_string;
}
int main() {
string str = "ababababaaa";
cout << getTheUpdatedString(str) << endl;
}
出力
上記のコードを実行すると、次の結果が得られます。
aaa
まとめ
このチュートリアルでは、a と b のみで構成された文字列から部分文字列 ab をすべて取り除いた結果を求める方法を解説しました。各文字の出現回数を数えて差を取るだけで、実際に削除処理をシミュレートすることなく効率的に答えを導ける点がポイントです。
本チュートリアルについてご不明な点がある場合は、コメント欄でお知らせください。
-
C++で特定の文字列が回文の回転であるかどうかを判定する方法
回文の回転とは回文(パリンドローム)とは、前から読んでも後ろから読んでも同じになる文字列のことです。本記事では、ある文字列が「回文を回転させたもの」になっているかどうかをC++で判定する方法を解説します。例えば「AAAAD」という文字列は、そのままでは回文ではありません。しかし、これを1文字ずつ回転させていくと「AADAA」となり、これは回文です。このように、元の文字列自体は回文でなくても、適切な位置まで回転させることで回文になるケースが存在します。判定アルゴリズムの考え方文字列が回文の回転であるかを確認するには、以下の手順を実行します。まず、現在の文字列が回文かどうかをチェックします。回文で
-
Pythonでスタック操作をシミュレートして最終結果を求める方法
文字列のリスト ops が与えられ、各要素は以下のいずれかの操作を表すとします。非負の整数値: その値をスタックにプッシュするPOP: スタックの最上位要素を削除するDUP: 最上位の要素をもう一度スタックに挿入し、複製する+: 上位2つの要素をポップし、その合計値をスタックにプッシュする-: 上位2つの要素をポップし、(最上位要素 − その直下の要素) の結果をスタックにプッシュするすべての操作を適用した後の、スタックの最上位要素を求めるのが目的です。もし操作が無効な場合(たとえば空のスタックからPOPしようとした場合など)は -1 を返します。動作例入力が ops = [5, 2, POP