LeetCode 345. 反转字符串中的元音字母

题目描述

345. 反转字符串中的元音字母

image-20230312173321571

思路分析

解法一:双指针(推荐)

核心思路

  • 左右指针分别寻找元音字母。
  • 当左右同时指向元音时交换并继续向中间移动。
  • 其他字符直接跳过。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示字符串长度。
  • 空间复杂度:O(n),使用字符数组便于交换。
import java.util.HashSet;
import java.util.Set;

class Solution {
    public String reverseVowels(String s) {
        Set<Character> vowels = new HashSet<>();
        for (char c : new char[]{'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}) {
            vowels.add(c);
        }

        char[] chars = s.toCharArray();
        int left = 0;
        int right = chars.length - 1;

        while (left < right) {
            while (left < right && !vowels.contains(chars[left])) {
                left++;
            }
            while (left < right && !vowels.contains(chars[right])) {
                right--;
            }

            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;

            left++;
            right--;
        }

        return new String(chars);
    }
}
func reverseVowels(s string) string {
	vowels := map[byte]struct{}{
		'a': {}, 'e': {}, 'i': {}, 'o': {}, 'u': {},
		'A': {}, 'E': {}, 'I': {}, 'O': {}, 'U': {},
	}

	chars := []byte(s)
	left, right := 0, len(chars)-1

	for left < right {
		for left < right {
			if _, ok := vowels[chars[left]]; ok {
				break
			}
			left++
		}
		for left < right {
			if _, ok := vowels[chars[right]]; ok {
				break
			}
			right--
		}

		chars[left], chars[right] = chars[right], chars[left]
		left++
		right--
	}

	return string(chars)
}

相似题目

题目 难度 考察点
344. 反转字符串 简单 双指针
541. 反转字符串 II 简单 双指针
557. 反转字符串中的单词 III 简单 字符串
125. 验证回文串 简单 双指针
151. 反转字符串里的单词 中等 字符串
本文作者:
本文链接: https://hgnulb.github.io/blog/2023/91955856
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!