Pythonで大文字・小文字の隣接ペアを削除して「良い文字列」を作るプログラム
問題の概要
英小文字と英大文字で構成された文字列 s が与えられます。次の両方の条件を満たす隣接する2文字 s[i] と s[i + 1] が一切含まれていない文字列を「良い文字列(good string)」と定義します。
0 <= i <= len(s) - 2s[i]が小文字で、s[i + 1]が同じ英字の大文字である(またはその逆)
文字列を良い文字列へ変換するには、文字列を「悪い」状態にしている隣接する2文字を選んで削除します。この操作を、文字列が良くなるまで繰り返します(空文字列も良い文字列とみなします)。そして、最終的に得られる文字列を求めます。
入力例
たとえば s = "popPpulaBbr" が入力された場合、出力は "popular" になります。これは、まず "pP" を削除し、続いて "Bb" を削除すると良い文字列になるためです。
解法のアプローチ
この問題は、スタックのように使えるリストを用意して、文字列を先頭から順に処理することで効率的に解けます。手順は以下のとおりです。
- 結果を格納するための新しいリスト
resを用意する - 文字列
sの各文字chについて次を繰り返すresが空でなく、末尾の要素とchが大文字・小文字の違いを無視して同じ文字であれば、resの末尾の要素を削除する- それ以外の場合は、
chをresの末尾に追加する
- 最後に
res内の要素をすべて連結して返す
この方法では各文字を一度ずつ処理するだけでよいため、計算量は文字数に比例する O(n) に抑えられ、非常に効率的です。
Pythonでの実装例
理解を深めるために、実際のコードを見てみましょう。
def solve(s):
res = []
for ch in s:
if res and res[-1] != ch and res[-1].lower() == ch.lower():
res.pop()
else:
res.append(ch)
return ''.join(res)
s = "popPpulaBbr"
print(solve(s))
入力
"popPpulaBbr"
出力
popular
まとめ
隣接する大文字・小文字のペアを削除して文字列を整える問題は、スタックの考え方を使うと簡潔に解決できます。文字を先頭から走査し、直前の文字と大文字小文字を区別せずに比較して一致すれば削除、そうでなければ追加——このシンプルな操作の繰り返しが答えにつながります。計算量は O(n) であり、長い文字列に対しても高速に動作する点が魅力です。
-
Pythonで文字列からすべての有効なIPアドレスの組み合わせを生成する方法
数字のみで構成された文字列が与えられたとき、そこから生成できるすべての有効なIPアドレスの組み合わせを求めるのが本記事の目的です。 基本的な考え方は、まず文字列の長さを確認し、その後に「.(ドット)」を挿入する位置を3か所選んで分割します。ドットの挿入位置の組み合わせをすべて試すことで、有効なIPアドレスを網羅的に抽出できます。 実行例 Input : 255011123222 → 有効なIPアドレスとして成立しない場合もある Input : 255011345890 → 有効なIPアドレス: 255.011.123.222 アルゴリズム Step 1: まず文字列の長さを確認する。 S
-
Pythonで文字列内のミラー文字を検索する方法【初心者向け解説】
ユーザーが入力した文字列と位置(ポジション)が与えられたとき、その位置から文字列の末尾までの文字を、アルファベット順を反転させた「ミラー文字」に変換するプログラムを作成します。この操作では、「a」→「z」、「b」→「y」、「c」→「x」、「d」→「w」のように、アルファベットの最初の文字が最後の文字に対応する形で置き換えを行います。 入力: p = 3 入力文字列 = python 出力: pygslm 上記の例では、3番目の位置以降の文字「t」「h」「o」「n」が、それぞれ逆順のアルファベット「g」「s」「l」「m」に変換されていることがわかります。先頭から指定位置までは元の文字列