Reverse Vowels of a String

Medium Strings
Reverse only the vowels of a string, leaving all other characters in place. Two-pointer technique.

Sample input

hello

Sample output

holle

Solution

def reverse_vowels(s):
    vowels = set("aeiouAEIOU")
    chars = list(s)
    i, j = 0, len(chars) - 1
    while i < j:
        if chars[i] not in vowels:
            i += 1
        elif chars[j] not in vowels:
            j -= 1
        else:
            chars[i], chars[j] = chars[j], chars[i]
            i += 1
            j -= 1
    return "".join(chars)

print(reverse_vowels("hello"))
function reverseVowels(s) {
  const vowels = new Set("aeiouAEIOU");
  const chars = s.split("");
  let i = 0, j = chars.length - 1;
  while (i < j) {
    if (!vowels.has(chars[i])) i++;
    else if (!vowels.has(chars[j])) j--;
    else {
      [chars[i], chars[j]] = [chars[j], chars[i]];
      i++;
      j--;
    }
  }
  return chars.join("");
}

console.log(reverseVowels("hello"));
public class Main {
    static String reverseVowels(String s) {
        String vowels = "aeiouAEIOU";
        char[] chars = s.toCharArray();
        int i = 0, j = chars.length - 1;
        while (i < j) {
            if (vowels.indexOf(chars[i]) == -1) i++;
            else if (vowels.indexOf(chars[j]) == -1) j--;
            else {
                char t = chars[i]; chars[i] = chars[j]; chars[j] = t;
                i++;
                j--;
            }
        }
        return new String(chars);
    }

    public static void main(String[] args) {
        System.out.println(reverseVowels("hello"));
    }
}
fun reverseVowels(s: String): String {
    val vowels = "aeiouAEIOU"
    val chars = s.toCharArray()
    var i = 0
    var j = chars.size - 1
    while (i < j) {
        when {
            chars[i] !in vowels -> i++
            chars[j] !in vowels -> j--
            else -> {
                val t = chars[i]; chars[i] = chars[j]; chars[j] = t
                i++
                j--
            }
        }
    }
    return String(chars)
}

fun main() {
    println(reverseVowels("hello"))
}
func reverseVowels(_ s: String) -> String {
    let vowels = Set("aeiouAEIOU")
    var chars = Array(s)
    var i = 0, j = chars.count - 1
    while i < j {
        if !vowels.contains(chars[i]) {
            i += 1
        } else if !vowels.contains(chars[j]) {
            j -= 1
        } else {
            chars.swapAt(i, j)
            i += 1
            j -= 1
        }
    }
    return String(chars)
}

print(reverseVowels("hello"))
String reverseVowels(String s) {
  const vowels = 'aeiouAEIOU';
  final chars = s.split('');
  var i = 0, j = chars.length - 1;
  while (i < j) {
    if (!vowels.contains(chars[i])) {
      i++;
    } else if (!vowels.contains(chars[j])) {
      j--;
    } else {
      final t = chars[i];
      chars[i] = chars[j];
      chars[j] = t;
      i++;
      j--;
    }
  }
  return chars.join();
}

void main() {
  print(reverseVowels("hello"));
}
#include <iostream>
#include <string>
using namespace std;

bool isVowel(char c) {
    return string("aeiouAEIOU").find(c) != string::npos;
}

string reverseVowels(string s) {
    int i = 0, j = s.size() - 1;
    while (i < j) {
        if (!isVowel(s[i])) i++;
        else if (!isVowel(s[j])) j--;
        else {
            swap(s[i], s[j]);
            i++;
            j--;
        }
    }
    return s;
}

int main() {
    cout << reverseVowels("hello") << endl;
    return 0;
}
#include <stdio.h>
#include <string.h>

int isVowel(char c) {
    return strchr("aeiouAEIOU", c) != NULL;
}

int main() {
    char s[] = "hello";
    int i = 0, j = strlen(s) - 1;
    while (i < j) {
        if (!isVowel(s[i])) i++;
        else if (!isVowel(s[j])) j--;
        else {
            char t = s[i]; s[i] = s[j]; s[j] = t;
            i++;
            j--;
        }
    }
    printf("%s\n", s);
    return 0;
}