Pythonで文字列を逆順に反転する方法|追加メモリ不要のインプレース手法
文字の配列が与えられたとき、追加のメモリ領域を使用せずに文字列を逆順に反転することを考えます。たとえば、入力が ['H', 'E', 'L', 'L', 'O'] である場合、期待される出力は ['O', 'L', 'L', 'E', 'H'] となります。
解法のアプローチ
この問題は「Two Pointers(ツーポインタ)」と呼ばれる定番のテクニックで効率的に解けます。考え方はシンプルで、配列の両端から中央に向かって文字を交換していくだけです。
手順
- 2つのポインタを用意します:
start = 0、end = 文字列の長さ - 1 s[start]とs[end]の文字を入れ替えますstartを1つ増やし、endを1つ減らします。これをstart < endの間繰り返します
この手法の計算量は、時間・空間ともに優れています。
- 時間計算量:O(n) — 配列の要素数に対して線形
- 空間計算量:O(1) — 追加のメモリはほぼ不要
実装例
以下のコードで実際の動作を確認してみましょう。
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None 戻り値は返さず、s をインプレースで変更する
"""
start = 0
end = len(s) - 1
while start < end:
s[start], s[end] = s[end], s[start]
start += 1
end -= 1
string_1 = ["H", "E", "L", "L", "O"]
ob1 = Solution()
ob1.reverseString(string_1)
print(string_1)
入力
String = ["H","E","L","L","O"]
出力
["O","L","L","E","H"]
補足:Pythonらしい書き方との比較
LeetCodeのような問題では「インプレース(元の配列を直接変更)」が求められますが、日常的なPythonコードではもっと簡潔な方法もあります。
- スライスを使う方法:
reversed_str = s[::-1]— 新しいリストを作成するため O(n) の追加メモリが必要です reverse()メソッド:s.reverse()— リストをインプレースで反転でき、内部実装はC言語のため高速ですreversed()関数:list(reversed(s))— イテレータを返すため、新しいリストが必要な場合に便利です
ただし、面接試験やアルゴリズム学習の場では、今回紹介したポインタ操作による手動の反転処理を理解しておくことが重要です。基本的なデータ構造の操作力を示せるだけでなく、他の応用問題にもつながる基礎となるためです。
-
Pythonのcasefold()メソッドとは?文字列の小文字変換と比較方法を解説
Pythonのcasefold()は、文字列内の英字をすべて小文字に変換するためのメソッドです。lower()と似ていますが、より積極的な変換を行う点が特徴で、ドイツ語の「ß」が「ss」に変換されるなど、国際化対応において強力な働きをします。2つの文字列に対してcasefold()を適用すれば、大文字・小文字の違いを無視して値を一致させることができます。そのため、ユーザー入力の比較や検索処理などで非常に役立ちます。casefold()の基本的な使い方次の例では、文字列にcasefold()を適用し、すべて小文字に変換された結果を出力しています。コード例string = BestTutorial
-
Pythonで文字列を逆順にする方法|スライスとreversed()の使い方を解説
Pythonでは、文字列スライスやrange演算子を活用することで、文字列を簡単に逆順(反転)にすることができます。この記事では、代表的な2つの方法をわかりやすく解説します。 方法1:スライス記法 [::-1] を使う(推奨・高速) 最もシンプルで一般的なのが、スライス記法を使う方法です。ステップに -1 を指定するだけで、文字列を後ろから前へ一文字ずつ取り出せます。 >>> Hello[::-1] olleH >>> Halloween[::-1] neewollaH スライスの仕組み 角括弧 [] の中には、コロン「:」で区切った3つの値を指定できます