Pythonで2つの文字列の間に存在する辞書順の文字列を見つける方法
問題の概要
2つの文字列 S と T が与えられたとき、S より辞書順で大きく、T より辞書順で小さい同じ長さの文字列が存在するかどうかを判定します。該当する文字列が存在しない場合は -1 を返します。
たとえば、入力が S = "bbb"、T = "ddd" の場合、出力は "bbc" となります。"bbb" の直後に辞書順で来る文字列は "bbc" であり、これは "ddd" よりも小さいためです。
辞書順の定義
S = S1S2…Sn があるインデックス i について S1 = T1, S2 = T2, …, Si-1 = Ti-1, Si < Ti を満たすとき、S は T = T1T2…Tn より辞書順で小さいと定義されます。つまり、先頭から順に文字を比較していき、最初に異なる文字が出現した時点で大小関係が確定するというルールです。
解法のアプローチ
この問題は「S の直後の文字列(辞書順で S の次に位置する文字列)を求める」という発想で解けます。数値のカウントアップと同じ要領で、末尾の文字から順に確認し、インクリメントできるなら1つ増やし、'z' に達していたら 'a' に戻して一つ前の文字へ繰り上がります。
アルゴリズムの手順
- 文字列の長さ
nを取得します。 iをn - 1から0まで逆順にループします。string[i]が'z'以外の場合:
ASCII コードを1つ増やした文字に置き換え、結合した文字列を返します。string[i]が'z'の場合:'a'に戻して(繰り上がり)一つ前の文字へ進みます。
Pythonでの実装例
def find_next(string):
n = len(string)
for i in range(n - 1, -1, -1):
if string[i] != 'z':
k = ord(string[i])
string[i] = chr(k + 1)
return ''.join(string)
string[i] = 'a'
S = "bbb"
T = "ddd"
S = list(S)
res = find_next(S)
if res != T:
print(res)
else:
print(-1)
入力
"bbb", "ddd"
出力
bbc
コードのポイント
- リストへの変換: Python の文字列はイミュータブル(変更不可)なため、
list()で文字のリストに変換して操作し、最後にjoin()で文字列に戻しています。 - T との比較: 求めた次の文字列が
Tと一致する場合、「S と T の間」に文字列は存在しないため-1を出力します。 - 計算量: 各文字を高々1回ずつ処理するため、時間計算量は O(n) と非常に効率的です。
- 注意点: すべての文字が
'z'の場合(例:"zzz")は繰り上がりが完了せず関数がNoneを返すため、実運用ではこのエッジケースの扱いにも留意が必要です。
-
【Python入門】2つの文字列から珍しい単語(ユニークな単語)を見つけるプログラムの作り方
はじめに この記事では、以下の問題文に対する解決方法を、実際のコード例とともにわかりやすく解説します。 問題文 2つの文字列が与えられたとき、その中から「珍しい単語」(どちらか一方の文字列にしか出現しない単語)をすべて抽出することを目標とします。両方の文字列に共通して含まれる単語は除外します。 解決のアプローチ ここでは辞書(dict)を使った出現回数のカウント方式を採用します。手順は次のとおりです。 空の辞書を用意する 各文字列をsplit()で単語ごとに分割する 各単語の出現回数を辞書に記録する 出現回数がちょうど1回の単語だけを結果として返す 実装例 # 珍しい単語を見つける関
-
Pythonで2つの文字列を結合して1つにまとめる方法:+演算子とjoin()メソッドの使い方
Pythonで文字列を結合する基本:+演算子Pythonで2つの文字列を1つに結合するには、連結演算子「+」を使用します。最もシンプルでよく使われる方法です。以下の例を見てみましょう。str1 = Hello str2 = World str3 = str1 + str2 print(str3)このコードを実行すると、次の出力が得られます。HelloWorldこのように、+演算子を使えば、2つの文字列がそのまま順番に連結され、新しい1つの文字列として生成されます。複数の文字列を結合する:join()メソッド3つ以上の文字列をまとめて結合したい場合や、要素の間に区切り文字を挿入したい場合は、st