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

前言

 继续字符串刷题之旅!本题难度为简单,利用双指针也是完成了多种解法,但是解法较他人的稍复杂,接下来先介绍我自己的解法,然后再总结一种优化解法。

题目描述

 编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

  示例 1:
   输入:“hello”
   输出:“holle”

  示例 2:
   输入:“leetcode”
   输出:“leotcede”

思路

 关于反转问题,首先要想到的是使用双指针来解题,然后按照这个思路接着往下想,需要使用左右指针分别指向符合条件的字符,然后进行反转。

 解法一:
  我们需要对元音字母进行存储记录,然后在遍历给定字符串时,将其中元音字母的下标记录到一个集合中,最后根据集合保存的下标进行反转操作。

 算法流程:

  1. 初始化:HashSet 用来存储元音字母(这里要注意的是,要包括大写),ArrayList 用来存储给定字符串中元音字母所在位置。
  2. 遍历字符串:将给定字符串中元音字母所在的位置记录到 ArrayList 中。
  3. 设置左右指针,根据所保存的元音字母位置开始反转。
class Solution {
    public String reverseVowels(String s) {
        char[] charArr = s.toCharArray();
        HashSet<Character> charSet = new HashSet<>();
        List<Integer> indexList = new ArrayList<>();
        charSet.add('a');  charSet.add('A');
        charSet.add('e');  charSet.add('E');
        charSet.add('i');  charSet.add('I');
        charSet.add('o');  charSet.add('O');
        charSet.add('u');  charSet.add('U');
        for(int i = 0;i < charArr.length;i++){
            char c = charArr[i];
            if(charSet.contains(c)){
                indexList.add(i);
            }
        }
        int start = 0;
        int end = indexList.size() - 1;
        while(start < end){
            char temp = charArr[indexList.get(start)];
            charArr[indexList.get(start)] = charArr[indexList.get(end)];
            charArr[indexList.get(end)] = temp;
            start++;
            end--;
        }
        return new String(charArr);
    }
}

 解法二:
  在解法一的基础上,仅需使用一次遍历字符串操作即可完成反转。也就是说,在遍历字符串时,寻找元音字母和反转操作放在一起执行。先找到左右两边的元音字母,然后对其进行反转。

 算法流程:

  1. 初始化:HashSet 用来存储元音字母(这里要注意的是,要包括大写);设置左右指针,左起0,右至字符数组长度减一。
  2. 遍历字符串:使用循环找出字符串左右两边符合条件的元音字母,然后进行反转。循环执行,直至退出循环。
class Solution {
    public String reverseVowels(String s) {
        char[] charArr = s.toCharArray();
        HashSet<Character> charSet = new HashSet<>();
        charSet.add('a');  charSet.add('A');
        charSet.add('e');  charSet.add('E');
        charSet.add('i');  charSet.add('I');
        charSet.add('o');  charSet.add('O');
        charSet.add('u');  charSet.add('U');
        int start = 0;
        int end = charArr.length - 1;
        while(start < end){
            // 寻找左边的元音字母
            while(start < end && !charSet.contains(charArr[start])){start++;}
            // 寻找右边的元音字母
            while(start < end && !charSet.contains(charArr[end])){end--;}
            // 反转符合条件的两个元音字母
            char temp = charArr[start];
            charArr[start] = charArr[end];
            charArr[end] = temp;
            start++;
            end--;
        }
        return new String(charArr);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值