Pythonで文字列の小文字と大文字が同じ順序かどうかを判定する方法
問題の概要
ここでは、アルファベットの大文字と小文字のみで構成された文字列 s を考えます(数字は含まれないものとします)。この文字列に対して、小文字が出現する順序と大文字が出現する順序がそれぞれ一致しているかどうかを判定します。つまり、ある文字が小文字として複数回現れる場合、その文字が大文字としても同じ回数、同じ相対的な位置関係で現れていなければなりません。
たとえば、入力が s = "piPpIePE" の場合、出力は True になります。小文字だけを抜き出すと "pipe"、大文字だけを抜き出すと "PIPE" となり、小文字部分を大文字に変換した結果が大文字部分と完全に一致するためです。
解決のためのアプローチ
この問題は、次の手順で解くことができます。
- 小文字を格納する文字列
lowercaseと、大文字を格納する文字列uppercaseを空文字列として初期化します。 iを 0 から文字列sの長さ − 1 まで順に処理します。s[i]が大文字の場合:uppercaseにs[i]を連結します。- それ以外(小文字)の場合:
lowercaseにs[i]を連結します。
lowercaseをすべて大文字に変換した文字列をto_upperとします。to_upperがuppercaseと一致すればTrue、一致しなければFalseを返します。
実装例
以下のPythonコードを見ると、動作をよりよく理解できるでしょう。
def solve(s):
lowercase = ""
uppercase = ""
for i in range(len(s)):
if ord(s[i]) >= 65 and ord(s[i]) <= 91:
uppercase += s[i]
else:
lowercase += s[i]
to_upper = lowercase.upper()
return to_upper == uppercase
s = "piPpIePE"
print(solve(s))
入力
"piPpIePE"
出力
True
コードの解説
ord() 関数は、文字に対応するUnicodeコードポイント(ASCIIコード)を返します。英語の大文字 A〜Z はコードポイント 65〜90 に対応しているため、ord(s[i]) の値がこの範囲内であれば、その文字を大文字と判断できます。
なお、よりPythonらしい書き方としては、文字列メソッド s[i].isupper() を使う方法もあります。こちらの方が可読性が高く、意図しない記号などを誤って判定するリスクもないため、実務では推奨されます。
計算量
- 時間計算量: O(n) ― 文字列を一度だけ走査します(n は文字列の長さ)。
- 空間計算量: O(n) ― 小文字と大文字それぞれの部分文字列を保持するためです。
-
Pythonで2つの二分木が完全に同じかどうかを判定するプログラム(構造と値の比較)
2つの二分木が与えられたとき、それらが構造と値の両方の観点で完全に一致しているかどうかを確認します。このような木のペアは「双子の木(twin trees)」と呼ばれることがあります。 たとえば、次のような入力があったとします。 この場合、最初のペアに対する出力は True になります。一方、2番目と3番目のペアは、それぞれ「値が異なる」ケースと「構造が異なる」ケースに該当するため、出力は False になります。 解決のアプローチ この問題は、再帰的な手法を用いて解くことができます。具体的には、以下の手順に従います。 solve() メソッドを定義し、2つのルートノードを受け取るようにしま
-
Pythonで文字列の前半と後半が同じ文字セットを持つか確認する方法
Pythonでは、文字列を中央で分割し、前半と後半が同じ文字セット(含まれる文字の種類と個数)を持っているかどうかを確認できます。入力文字列の長さは偶数の場合もあれば奇数の場合もあります。文字数が偶数であれば、ちょうど半分の位置で2つの部分に分割します。文字数が奇数の場合は、中央の1文字を無視し、残りの前半と後半を比較します。 処理の流れ 判定は次の手順で行います。 文字列の長さを取得し、偶数か奇数かを判定する 奇数の場合は中央の文字を除外し、前半と後半に分割する それぞれの部分をリストに変換してソートする ソート後の2つのリストを比較し、完全に一致すれば「同じ文字セット」と判断する