【刷题打卡】345. 反转字符串中的元音字母

109 阅读1分钟

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

一、题目描述:

345. 反转字符串中的元音字母 - 力扣(LeetCode) (leetcode-cn.com)

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

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

示例 1:

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

示例 2:

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

提示:

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

二、思路分析:

采用双指针中的两端指针的思想,有几个点要考虑:

  • 元音字母不仅包含小写字母,要考虑到。使用HashSet进行元音字母的存储,使用contains进行存在性比较。
  • 进行字符类型的调换时,不能使用charAt()这个函数只是用来展示用的,由于String类型的不可修改性。要进行位置调换,只能将字符串转换为字符数组或使用StringBuilder进行操作。
    思路:两端指针,其中有一端指向的不是元音字符,则对向的指针向自己移动,如果两指针均指向元音字母,则进行调换,最后将字符数组转换为String类型进行输出。

三、AC 代码:

class Solution {

    HashSet<Character> yuanyin= new HashSet<>(){
        {//创建set集合,用来存储元音字符,方便后面contains使用
            add('a');
            add('e');
            add('i');
            add('o');
            add('u');
            add('A');
            add('E');
            add('I');
            add('O');
            add('U');
        }
    };

    public String reverseVowels(String s) {
        int left=0;
        int right=s.length()-1;
        char[] a=s.toCharArray();
        while(left<right){
            if(yuanyin.contains(a[left])&&yuanyin.contains(a[right])){
                char tmp;
                tmp=a[left];
                //这里不能使用charAt(),因为String是不可修改的类型,所以不能直接对其进行修改
                a[left]=a[right];
                a[right]=tmp; 
                left++;
                right--;

            }
            else if(yuanyin.contains(s.charAt(left)))
                right--;
                else 
                    left++;    
        }
            return new String(a);
    }


}

四、参考:

java ,接近双百。用char[]数组接String字符串。双指针,两指针分别碰到元音停止,都停止了交换,再各自自增自减 - 反转字符串中的元音字母 - 力扣(LeetCode)