【Python入門】2つの文字列が互いの回転かどうかを判定する方法
この記事では、2つの英文字列 s と t(大文字・小文字が混在していても可)が与えられたとき、一方がもう一方の回転であるかどうかを判定するプログラムを Python で実装する方法を解説します。
回転とは?
文字列の「回転」とは、文字列の先頭からいくつかの文字を取り除き、それを末尾に移動させる操作によって得られる文字列のことです。例えば、s = "koLKAta" と t = "KAtakoL" が与えられた場合、t は s を回転させた結果と一致するため、出力は True になります。
解法のアプローチ
この問題は、以下の手順で効率的に解くことができます。
- 長さの確認:
sとtの長さが異なる場合は、回転になり得ないためFalseを返します。 - 文字列の連結:
sを自分自身と連結します(s = s + s)。回転した文字列は必ずこの連結後の文字列の中に部分文字列として現れます。 - 存在確認: 連結後の文字列の中に
tが含まれていればTrue、含まれていなければFalseを返します。
実装例
以下が実際の Python コードです。
def solve(s, t):
if len(s) != len(t):
return False
s = s + s
return True if s.find(t) != -1 else False
s = "koLKAta"
t = "KAtakoL"
print(solve(s, t))コードのポイント
s.find(t) は、t が見つかった場合はその開始インデックスを、見つからなかった場合は -1 を返します。この性質を利用して、回転判定を行っています。なお、Python の in 演算子を使って return t in s と書くことで、より簡潔に記述することも可能です。
入力例
s = "koLKAta", t = "KAtakoL"
出力例
True
計算量について
このアルゴリズムの時間計算量は O(n) です(n は文字列の長さ)。部分文字列検索には効率的なアルゴリズムが使われるため、大きな文字列でも高速に動作します。空間計算量も O(n) で、連結後の文字列を保存するために必要となります。
-
Pythonで凹多角形かどうかを判定するプログラムの作り方
Pythonで凹多角形を判定する方法 多角形の外周上の頂点が時計回りの順序で与えられているとします。このとき、これらの頂点が凸多角形を形成しているかどうかを判定する必要があります。多角形の内角のうち一つでも180°より大きい角度が存在する場合、その多角形は凹多角形であると言えます。 次の図を見ると分かるように、連続する3つの頂点に着目して内角を確認すると、CDEの部分だけが180°を超えています。 そのため、入力が points = [(3,4), (4,7),(7,8),(8,4),(12,3),(10,1),(5,2)] のような場合、出力は True となります。 解決のための手順
-
Pythonで点が凸包を形成しているかどうかを判定する方法
多角形の外周にある頂点が時計回りの順序で与えられているとします。このとき、これらの点が凸包(コンベックスハル)を形成しているかどうかを判定する必要があります。 上の図からも分かるように、凸多角形では連続する3つの頂点からなる内角がすべて180°以下になります。つまり、すべての角度が180°以下であれば、その多角形は凸包であると判断できます。 例えば、入力が points = [(3,4), (4,7), (7,8), (11,6), (12,3), (10,1), (5,2)] のような場合、出力は True になります。 解法のアプローチ この問題を解くには、以下の手順に従います。 n