1
2

More than 3 years have passed since last update.

LeetCode344[Reverse String]-Recursion再帰で実現する。

Posted at

タイトルの通り、LeetCode 344の解き方についてシェアしてきます。

問題文はそのままコピーします、

Write a function that reverses a string. The input string is given as an array of characters s.

Example 1:

Input: s = ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]
Example 2:

Input: s = ["H","a","n","n","a","h"]
Output: ["h","a","n","n","a","H"]


Constraints:

1 <= s.length <= 105
s[i] is a printable ascii character.

ま、簡単に言うと、string型の'hello'を'olleh'で変換することです。

各言語内の関数やモジュールを使えばええじゃんと思うかもしれないが、実はこれを実現するためにはいろいろな方法があります。

今回は2つの方法を紹介します、一つはタイトルの通り再帰で実現します。もう一つはTwo pointersで実現します。

Recursion solution

Recursionの概念はわかると思いますが、ざっくりで言うと、
1. 関数内部にもう一度今所属している関数を呼び出す。
2.永遠に呼び出されたらキリがないので、必ずなにか終わりの条件を追加する。

実はこの問題に関して、Two pointersのやり方は多分理解しやすいが、Recursionで実現するのも面白いです。

では、大体のイメージ図からどのように再帰で実現したかをみてみましょう!

image.png

解説:

まず、1回目の再帰はhとoを同時に再帰します(多分理解にくいが、コード見ればわかると思います)。

2回目に入って、また再帰し、lのところで再帰が止まります。

止まったら、今回は元に戻します。

ここで、2回目の再帰の部分はeとlを交換し、1回目はhとoを交換します。

それで終了となります。

コード:

def recursion(s, left, right):
        if left >= right:
            return
        recursion(s, left+1, right-1)
        s[left], s[right] = s[right], s[left]

left >= rightが再帰の終了条件。
4行目の部分は再帰の部分で、毎回の再帰は左側を右に1 step, 右側は左に1 stepの形ですすみます。
再帰が終了した後(left < rightの時)、各文字を交換します。

Two pointers

def recursion(s, left, right):
    while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1

    return s

考え方としては、再帰の解き方と似ていますが、実は違いますね。

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2