2 Pointer Reverse Letters - codepath/compsci_guides GitHub Wiki

Unit 4 Session 1 (Click for link to problem statements)

U-nderstand

Understand what the interviewer is asking for by using test cases and questions about the problem.

  • Are numbers or special characters considered as non-letters?
    • Yes, only alphabetic characters should be reversed. Numbers, punctuation, and other special characters should remain in their original positions.
  • What if the string is empty or contains only non-letter characters?
    • The function should handle these cases gracefully, returning the original string unchanged if necessary.

P-lan

Plan the solution with appropriate visualizations and pseudocode.

General Idea: Use two pointers to identify letters from both ends of the string and swap them until they meet in the middle.

1) Define a helper function `is_letter` to determine if a character is an alphabetic letter.
2) Convert the string into a list of characters to facilitate in-place swaps.
3) Initialize two pointers, `left` at the beginning and `right` at the end of the list.
4) While the `left` pointer is less than the `right` pointer:
  a) Move the `left` pointer rightward until it points to a letter.
  b) Move the `right` pointer leftward until it points to a letter.
  c) If both pointers point to letters, swap them and then move both pointers towards the center.
5) Convert the list back to a string and return it.

⚠️ Common Mistakes

  • Ignoring non-letter characters can result in an incorrect string structure.
  • Incorrectly handling the pointers could lead to swaps of non-letter characters or missing letter reversals.

I-mplement

# Helper function to check if a character is an English letter
def is_letter(c):
    return c.isalpha()

def reverse_only_letters(s):
    # Convert the string into a list of characters for easy manipulation
    chars = list(s)
    left, right = 0, len(chars) - 1

    while left < right:
        if not is_letter(chars[left]):
            left += 1
        elif not is_letter(chars[right]):
            right -= 1
        else:
            # Swap the characters
            chars[left], chars[right] = chars[right], chars[left]
            left += 1
            right -= 1

    # Convert the list of characters back to a string
    return ''.join(chars)