345. Reverse Vowels of a String
two pointer で左右から母音を探して交換する方式。
class Solution:
def reverseVowels(self, s: str) -> str:
vowels = set('aeiouAEIOU')
s = list(s)
l, r = 0, len(s) - 1
while l < r:
if s[l] not in vowels:
l += 1
elif s[r] not in vowels:
r -= 1
else:
s[l], s[r] = s[r], s[l]
l += 1
r -= 1
return ''.join(s)
ポイントは3つ:
文字列は変更できないので list(s) で書き換え可能な形にして、最後に ''.join(s) で戻す
母音判定は list じゃなくて set を使うと in チェックがO(1)で速い
if / elif / else は1ループにつきどれか1つしか実行されない。ifがFalseなら同じループ内でelifをチェックしにいく(次のループまで待つわけじゃない)
最初は r -= 1 を r += 1 と書き間違えて、rがどんどん右に飛び出して IndexError になったのもいい学びだった。lは右へ、rは左へ動いて真ん中で出会うイメージを持つと間違えにくい。