image.png

解决思路

双指针

使用双指针,一个指针从头向尾遍历,一个指针从尾到头遍历,当两个指针都遍历到元音字符时,交换这两个元音字符。

为了快速判断一个字符是不是元音字符,我们将全部元音字符添加到集合 HashSet 中,从而以 O(1) 的时间复杂度进行该操作。

时间复杂度为 O(N):只需要遍历所有元素一次
空间复杂度 O(1):只需要使用两个额外变量

  1. private final static HashSet<Character> vowels = new HashSet<>(
  2. Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
  3. public String reverseVowels(String s) {
  4. if (s == null) return null;
  5. int i = 0, j = s.length() - 1;
  6. char[] result = new char[s.length()];
  7. while (i <= j) {
  8. char ci = s.charAt(i);
  9. char cj = s.charAt(j);
  10. if (!vowels.contains(ci)) {
  11. result[i++] = ci;
  12. } else if (!vowels.contains(cj)) {
  13. result[j--] = cj;
  14. } else {
  15. result[i++] = cj;
  16. result[j--] = ci;
  17. }
  18. }
  19. return new String(result);
  20. }