import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; /** * Write a function that takes a string as input and reverse only the vowels of a string. * <p> * Example 1: * Given s = "hello", return "holle". * <p> * Example 2: * Given s = "leetcode", return "leotcede". * <p> * Tags: Two Pointers, String * Similar Problems: (E) Reverse String */ public class ReverseVowelsOfAString { private ReverseVowelsOfAString rv; /** * Use two pointers, search for vowels from both ends */ public String reverseVowels(String s) { if (s == null || s.isEmpty()) return s; StringBuilder sb = new StringBuilder(s); String vowels = "aeiouAEIOU"; int i = 0; int j = s.length() - 1; while (i < j) { while (i < j && vowels.indexOf(s.charAt(i)) == -1) { i++; } while (i < j && vowels.indexOf(s.charAt(j)) == -1) { j--; } char c = sb.charAt(i); sb.setCharAt(i, sb.charAt(j)); sb.setCharAt(j, c); i++; j--; } return sb.toString(); } @Before public void setUp() { rv = new ReverseVowelsOfAString(); } @Test public void testNullInput() { Assert.assertNull(rv.reverseVowels(null)); } @Test public void testEmptyInput() { Assert.assertEquals("", rv.reverseVowels("")); } @Test public void testWithExamples() { // hello -> holle String s = "hello"; Assert.assertEquals("holle", rv.reverseVowels(s)); // leetcode -> leotcede s = "leetcode"; Assert.assertEquals("leotcede", rv.reverseVowels(s)); // c -> c s = "c"; Assert.assertEquals("c", rv.reverseVowels(s)); // a -> a s = "a"; Assert.assertEquals("a", rv.reverseVowels(s)); } @After public void tearDown() { rv = null; } }