LeetCode 数组系列 ~反转字符串中的元音字母

78 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

概述

数组算是一个并不复杂的数据结构,但就是这个,面试官就能在面试过程中考察出很多东西来。例如经典的排序问题,二分搜索,滑动窗口等等,都是在数组这种最基础等数据结构中处理问题的。

我们做数组类算法问题的时候,常常需要定义一个变量,明确该变量的意义,并不停的维护这个变量,也需要特别注意初始值边界问题。

题目

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。

元音字母包括 'a''e''i''o''u',且可能以大小写两种形式出现。

示例

输入: s = "hello"
输出: "holle"
输入: s = "leetcode"
输出: "leotcede"

提示

  • 1 <= s.length <= 3 * 10^5
  • s 由 可打印的 ASCII 字符组成

代码实现

双指针

该题解题思路与《验证回文串》类似,其实现方式均可采用两个指针指向数组两端,逐位往中间移动,判断是否为元音字母,交换两个元素,具体步骤如下:

  1. 保存元音字母集合;
  2. 将字符串转换为字符数组;
  3. 定义两个指针,逐位遍历,往中间移动;
  4. 找到元音字母,交互两个元素的位置;
  5. 将字符数组转换为字符串并返回。
class Solution {
    public String reverseVowels(String s) {
        // 保存元音字母集合
        Set<Character> set = new HashSet<>();
        set.add('a');
        set.add('e');
        set.add('i');
        set.add('o');
        set.add('u');
        set.add('A');
        set.add('E');
        set.add('I');
        set.add('O');
        set.add('U');
        // 将字符串转换为字符数组
        char[] c = s.toCharArray();
        
        // 定义两个指针,逐位遍历,往中间移动
        int left = 0, right = c.length - 1;
        while(left < right){
            // 找到元音字母,交互两个元素的位置
            while(left < right && !set.contains(c[left])){
                ++left;
            }
            while(left < right && !set.contains(c[right])){
                --right;
            }
            if(left < right){
                swap(c, left, right);
            }
            ++left;
            --right;
        }
        // 将字符数组转换为字符串并返回
        return new String(c);
    }

    private void swap(char[] c, int left, int right){
        char tmp = c[left];
        c[left] = c[right];
        c[right] = tmp;
    }
}