Pythonで文字列を2文字回転させて別の文字列と一致するか判定する方法
この記事では、Pythonを使って「ある文字列を左または右に2文字回転させると、もう一方の文字列と一致するかどうか」を判定する方法を解説します。
問題の概要
2つの文字列 s と t が与えられたとき、t を左方向または右方向のどちらかに2文字分回転させることで s が得られるかどうかを確認します。
例えば、入力が s = "kolkata"、t = "takolka" の場合を見てみましょう。「takolka」を左に2文字回転させると「kolkata」になるため、出力は True となります。
解決の手順
この問題は以下のステップで解決できます。
- まず、
sとtの文字数が異なる場合は、回転しても一致することはないため False を返します。 - 右回転用の結果を格納するための空文字列
right_rotを用意します。 - 同様に、左回転用の空文字列
left_rotを用意します。 - 変数
lにtの長さを代入します。 - 左回転の場合:
tの末尾2文字(インデックスl-2以降)を先頭に移動し、残りの部分(インデックス0からl-3まで)を後ろに連結します。 - 右回転の場合:
tの先頭2文字を除いた部分(インデックス2以降)を前にし、先頭2文字(インデックス0から1まで)を末尾に連結します。 - 最後に、
sがright_rotまたはleft_rotのいずれかと一致すれば True、そうでなければ False を返します。
実装例
それでは、実際のコードを見て理解を深めましょう。
def solve(s, t):
if (len(s) != len(t)):
return False
right_rot = ""
left_rot = ""
l = len(t)
left_rot = (left_rot + t[l - 2:] + t[0: l - 2])
right_rot = right_rot + t[2:] + t[0:2]
return (s == right_rot or s == left_rot)
s = "kolkata"
t = "takolka"
print(solve(s, t))入力
"kolkata", "takolka"
出力
True
コードの解説
このアルゴリズムのポイントは、Pythonのスライス記法を活用している点です。t[l-2:] は文字列の末尾2文字を取得し、t[0:l-2] は先頭から末尾2文字を除いた部分を取得します。これらを連結することで、左への2文字回転を実現しています。同様に、t[2:] と t[0:2] を連結することで右への2文字回転を作成しています。
計算量は文字列の長さを n とすると O(n) となり、非常に効率的です。文字列の長さチェックを最初に行うことで、長さが異なるケースを素早く除外できる点も実用的です。
-
Pythonで文字列が英数字のみかどうかを判定する方法【isalnum()と正規表現】
Pythonでは、文字列が英数字(アルファベットと数字)のみで構成されているかどうかを簡単に判定できます。主な方法は2つあります。文字列クラスに組み込まれている isalnum() メソッドを使う方法と、正規表現を使う方法です。 isalnum()メソッドを使う方法 Pythonの文字列クラスには isalnum() というメソッドが用意されています。このメソッドを文字列に対して呼び出すと、文字列が英数字のみで構成されている場合に True を、記号などが含まれる場合には False を返します。 >>> 123abc.isalnum() True >>>
-
Pythonで部分文字列が文字列に含まれているか確認する方法(in演算子とfindメソッド)
Pythonでは、ある文字列が別の文字列の部分文字列(サブストリング)として含まれているかどうかを簡単に確認できます。最も基本的な方法は、in 演算子を使うことです。in 演算子を使った判定方法in 演算子は、左辺の文字列が右辺の文字列に含まれている場合に True を、含まれていない場合に False を返します。以下はその使用例です。print(ello in hello world)実行結果:Trueこのように、ello は hello world の中に含まれているため、True が出力されます。find() メソッドで位置(インデックス)を取得する部分文字列が含まれているかどうかに加