less than 1 minute read

Problem Statement

leetcode problem link

My Solution [Accepted]

class Solution:
    def reverseOnlyLetters(self, s: str) -> str:
        reversed_s = [c for c in s if c.isalpha()]
        l, r = 0, len(reversed_s) - 1
        while l < r:
            reversed_s[l], reversed_s[r] = reversed_s[r], reversed_s[l]
            l += 1
            r -= 1
        res = []
        j = 0
        for i, c in enumerate(s):
            if c.isalpha():
                res.append(reversed_s[j])
                j += 1
            else:
                res.append(c)

        return "".join(res)

Editorial

Approach 1: Stack of Letters

class Solution(object):
    def reverseOnlyLetters(self, S):
        letters = [c for c in S if c.isalpha()]
        ans = []
        for c in S:
            if c.isalpha():
                ans.append(letters.pop())
            else:
                ans.append(c)
        return "".join(ans)

Approach 2: Reverse Pointer

class Solution(object):
    def reverseOnlyLetters(self, S):
        ans = []
        j = len(ans) - 1
        for i, x in enumerate(S):
            if x.isalpha():
                while not S[j].isalpha():
                    j -= 1
                ans.append(S[j])
                j -= 1
            else:
                ans.append(x)

        return "".join(ans)