Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで2つの文字列が回転関係にあるかどうかを判定する方法

問題概要

2つの文字列 st が与えられたとき、ts を回転(ローテーション)させたものになっているかどうかを判定します。

例えば、s = "hello"t = "llohe" の場合、s を左に2文字分回転すると "llohe" になるため、結果は True となります。

解法のアプローチ

この問題は「文字列を自分自身と連結する」というシンプルなテクニックで効率的に解くことができます。手順は以下の通りです。

  • st の長さが異なる場合、回転関係にはなり得ないので 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行版では、まず長さが等しいことを確認し、その上で ts + s に含まれるかどうかを一度に判定しています。計算量は O(n) で、文字列比較も高速に行えます。

  1. Pythonで凹多角形かどうかを判定するプログラムの作り方

    Pythonで凹多角形を判定する方法 多角形の外周上の頂点が時計回りの順序で与えられているとします。このとき、これらの頂点が凸多角形を形成しているかどうかを判定する必要があります。多角形の内角のうち一つでも180°より大きい角度が存在する場合、その多角形は凹多角形であると言えます。 次の図を見ると分かるように、連続する3つの頂点に着目して内角を確認すると、CDEの部分だけが180°を超えています。 そのため、入力が points = [(3,4), (4,7),(7,8),(8,4),(12,3),(10,1),(5,2)] のような場合、出力は True となります。 解決のための手順

  2. Pythonで点が凸包を形成しているかどうかを判定する方法

    多角形の外周にある頂点が時計回りの順序で与えられているとします。このとき、これらの点が凸包(コンベックスハル)を形成しているかどうかを判定する必要があります。 上の図からも分かるように、凸多角形では連続する3つの頂点からなる内角がすべて180°以下になります。つまり、すべての角度が180°以下であれば、その多角形は凸包であると判断できます。 例えば、入力が points = [(3,4), (4,7), (7,8), (11,6), (12,3), (10,1), (5,2)] のような場合、出力は True になります。 解法のアプローチ この問題を解くには、以下の手順に従います。 n