Pythonで文字列の文字を入れ替えて別の文字列を作れるか判定する方法
2つの文字列 s と t が与えられたとき、s の文字を入れ替えることで t を作れるかどうかを判定する問題です。これはいわゆる「アナグラム(並べ替え)判定」の一種と言えます。
例えば、入力が s = "worldlloeh"、t = "helloworld" の場合、出力は True になります。"worldlloeh" の文字を適切に入れ替えることで "helloworld" を作れるためです。
解法のアプローチ
この問題は、両方の文字列に含まれる各文字の出現回数を比較することで効率的に解けます。手順は以下の通りです。
- s_len := s の長さ、t_len := t の長さとする
- s_len と t_len が一致しない場合は、False を返す
- freq := s の各文字とその出現回数を記録するマップ(辞書)を作成する
- i を 0 から t_len - 1 まで繰り返す:
- freq[t[i]] を 1 減らす
- freq[t[i]] が 0 未満になった場合は False を返す(t に必要な文字が s に足りないことを意味する)
- 最後に True を返す
それでは、理解を深めるために実際の実装を見てみましょう。
実装例
from collections import defaultdict
def solve(s, t):
s_len = len(s)
t_len = len(t)
if (s_len != t_len):
return False
freq = defaultdict(int)
for char in s :
freq[char] += 1
for i in range(t_len) :
freq[t[i]] -= 1
if freq[t[i]] < 0:
return False
return True
s = "worldlloeh"
t = "helloworld"
print(solve(s, t))入力
"worldlloeh", "helloworld"
出力
True
計算量について
このアルゴリズムの時間計算量は O(n)、空間計算量も O(n) です(n は文字列の長さ)。まず文字列の長さが同じであることを確認し、その後、各文字の出現回数を1回ずつ数えるだけで済むため、非常に効率的な方法です。
-
【Python】文字列がすべてユニークな文字で構成されているか判定する方法
本記事では、与えられた文字列に含まれる文字がすべて一意(ユニーク)であるかどうかを判定するPythonプログラムについて、その解法とアプローチをわかりやすく解説します。 問題の概要 文字列が入力として与えられたとき、その文字列に含まれるすべての文字が重複なく一意であるかどうかを判定します。たとえば「abcde」はすべて異なる文字で構成されているためTrue、「tutorialspoint」のように同じ文字が複数回出現する場合はFalseとなります。 アプローチ この問題は、以下のような手順で効率的に解くことができます。 ブール値の配列を用意する: 各インデックス i が「アルファベット(AS
-
Pythonで文字列がfloatに変換可能かどうかを判定する方法
Pythonでは、文字列がfloat(浮動小数点数)として有効かどうかを確認したい場面がよくあります。最もシンプルで確実な方法は、float()関数をtry-exceptブロックで囲むことです。 基本的な変換方法 文字列をfloatに変換するには、次のように記述します。 try: print(float(112.15)) except ValueError: print(Cannot parse) このコードを実行すると、以下の出力が得られます。 112.15 変換できない場合の挙動 もし文字列が数値として解析できない場合(例えば abc のような文字列)、ValueError