Reverse Vowels - 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 we considering both uppercase and lowercase vowels?
    • Yes, both cases should be considered.
  • Does the order of consonants need to remain unchanged?
    • Yes, only the vowels should be moved.

P-lan

Plan the solution with appropriate visualizations and pseudocode.

General Idea: Identify vowels using a helper function, then use two pointers to swap the vowels from both ends towards the middle.

1) Define a helper function `is_vowel` to check if a character is a vowel.
2) Convert the string to a list for in-place modifications.
3) Initialize two pointers, `left` at the beginning and `right` at the end of the list.
4) While `left` pointer is less than `right` pointer:
  a) Increment `left` until it points to a vowel.
  b) Decrement `right` until it points to a vowel.
  c) Swap the characters at `left` and `right`.
  d) Move both `left` and `right` inward to continue the process.
5) Convert the list back to a string and return.

⚠️ Common Mistakes

  • Skipping characters that are vowels due to incorrect condition checks.
  • Incorrect handling of the two pointers can cause an infinite loop or early termination of the function.

I-mplement

def is_vowel(c):
    # Check if a character is a vowel (considering both lowercase and uppercase)
    return c in 'aeiouAEIOU'

def reverse_vowels(s):
    # Convert the string to a list to modify it in place
    s_list = list(s)
    left = 0
    right = 0 len(s) - 1

    while left < right:
        # Move the left pointer until it points to a vowel
        while left < right and not is_vowel(s_list[left]):
            left += 1
        # Move the right pointer until it points to a vowel
        while left < right and not is_vowel(s_list[right]):
            right -= 1
        # Swap the vowels
        temp = s_list[left]
        s_list[left] = s_list[right]
        s_list[right] = temp
        left = left + 1
        right = right - 1

    # Convert the list back into a string
    return ''.join(s_list)