Table of Contents
Problem Statement
Reverse Only Letters LeetCode Solution – Given a string s
, reverse the string according to the following rules:
- All the characters that are not English letters remain in the same position.
- All the English letters (lowercase or uppercase) should be reversed.
Return s
after reversing it.
Input: s = "ab-cd" Output: "dc-ba"
Explanation
Write the characters of S
one by one. When we encounter a letter, we want to write the next letter that occurs if we iterated through the string backward.
So we do just that: keep track of a pointer j
that iterates through the string backward. When we need to write a letter, we use it.
if we look closely we need to reverse the string but only consider letters so we can keep two pointers: one at the start and one at the end and then keep swapping values of start and end if they meet the given condition.
Another Approach:
Collect the letters of S
separately into a stack, so that popping the stack reverses the letters. (Alternatively, we could have collected the letters into an array and reversed the array.)
Then, when writing the characters of S
, any time we need a letter, we use the one we have prepared instead.
Code
C++ Code for Reverse Only Letters
class Solution { public: string reverseOnlyLetters(string S) { for (int i = 0, j = S.length() - 1; i < j;) { if (!isalpha(S[i])) ++i; else if (!isalpha(S[j])) --j; else swap(S[i++], S[j--]); } return S; } };
Java Code for Reverse Only Letters
class Solution { public String reverseOnlyLetters(String S) { StringBuilder sb = new StringBuilder(S); for (int i = 0, j = S.length() - 1; i < j;) { if (!Character.isLetter(sb.charAt(i))) { ++i; } else if (!Character.isLetter(sb.charAt(j))) { --j; } else { sb.setCharAt(i, S.charAt(j)); sb.setCharAt(j--, S.charAt(i++)); } } return sb.toString(); } }
Python Code for Reverse Only Letters
class Solution: def reverseOnlyLetters(self, S): S, i, j = list(S), 0, len(S) - 1 while i < j: if not S[i].isalpha(): i += 1 elif not S[j].isalpha(): j -= 1 else: S[i], S[j] = S[j], S[i] i, j = i + 1, j - 1 return "".join(S)
Complexity Analysis for Reverse Only Letters LeetCode Solution
Time Complexity
O(n/2) -> Single Pass
Space Complexity
O(1) -> no extra space is used other than two variables
Reference: https://algodaily.com/lessons/using-the-two-pointer-technique