Pythonで2つの文字列が回転関係にあるかどうかを判定する方法
問題概要
2つの文字列 s と t が与えられたとき、t が s を回転(ローテーション)させたものになっているかどうかを判定します。
例えば、s = "hello"、t = "llohe" の場合、s を左に2文字分回転すると "llohe" になるため、結果は True となります。
解法のアプローチ
この問題は「文字列を自分自身と連結する」というシンプルなテクニックで効率的に解くことができます。手順は以下の通りです。
sとtの長さが異なる場合、回転関係にはなり得ないので False を返します。temp := s + sとして、sを2回連結した文字列を作成します。tempの中にtが含まれている(出現回数が0より大きい)場合は True を返します。- それ以外の場合は False を返します。
この手法が機能する理由は、s を2回連結した文字列には、s のすべての回転パターンが必ず部分文字列として含まれるためです。
サンプルコード
def solve(s, t):
if len(s) != len(t):
return False
temp = s + s
if temp.count(t) > 0:
return True
return False
s = "hello"
t = "llohe"
print(solve(s, t))入力
"hello", "llohe"
出力
True
補足:in演算子を使ったより簡潔な書き方
count() メソッドの代わりに in 演算子を使うと、コードをさらに簡潔にできます。
def solve(s, t):
return len(s) == len(t) and t in s + sこの1行版では、まず長さが等しいことを確認し、その上で t が s + s に含まれるかどうかを一度に判定しています。計算量は 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