てくてくテック

【LeetCode】345. Reverse Vowels of a String 24日目

leetcode

どーも!

たかぽんです!

今回もやっていきます!

345. Reverse Vowels of a String

今回の問題は以下です。

文字列が渡されるため、その中の母音を逆順にしろ...といった感じです。

逆順というのは以下のような感じです。

Input: "hello"
Output: "holle"

helloの2番目のeと最後のoという、二つの母音がある場合はこれがそのまま逆になります。

Input: "leetcode"
Output: "leotcede"

leetcodeのように母音が4つある場合は、母音だけ出すと、"eeoe"となります。

そのため、leetの二つのeの箇所は先程の母音の後ろから二つ分の"eo"、そしてcodeのo,eの箇所はさらにその後ろから3,4つぶんのe,になります。

アルゴリズム

では、アルゴリズムを検討していきましょう!

今回、母音のリストをあらかじめ作っておきます。

母音であれば"aiueo"の5つですみます(実際は大文字も含むので10 ですが...)。

そして、そのリストに対象の文字が含まれているかどうかで母音のチェックを行います。

そして、大まかな方針として...

ある文字列から、母音だけ、前後の順番を維持した状態で取得します。

普通に追加していけば先頭に元の文字列の一番初めに出てきた母音が入る想定です。

"hello"なら、"eo"という形です。

そして、再度元の文字列を捜索し、母音が出てくる場所を探します。

そして、先程取り出した母音のリストの末尾から一つづつ置き換えていきます。

こうすることで、逆順にすることができました!

最後に、上記をpythonにて記載したコードを書いておきます。

提出したコード

class Solution:
    def reverseVowels(self, s: str) -> str:
        # 母音を判断するためのリスト
        vowels = ["a","i","u","e","o","A","I","U","E","O"]
        # 一度母音の箇所のみ保持するための配列を用意
        includedVowels = []
        
        # 一周目で配列中の母音を全て抽出する
        for i,char in enumerate(s):
            if char in vowels:
                includedVowels.append(char)

        # 文字列の特定位置を置き換える処理をするため、リスト化する
        stringList = list(s)
        # 二週目で配列中の母音を先程抽出したリストの末尾から代入していく
        for i, char in enumerate(s):
            if char in vowels:
                stringList[i] = includedVowels[-1]
                includedVowels.pop(-1)
 
        output = "".join(stringList)
        return output


## 結果
Runtime: 64 ms, faster than 42.74% of Python3 online submissions for Reverse Vowels of a String.
Memory Usage: 15.4 MB, less than 35.46% of Python3 online submissions for Reverse Vowels of a String.
モバイルバージョンを終了