kylin来刷题啦-Day05:345. 反转字符串中的元音字母

176 阅读1分钟

这是我参与更文挑战的第11天,活动详情查看: 更文挑战

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

题目描述

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

示例 1:

输入:"hello"

输出:"holle"

示例 2:

输入: "leetcode"

输出: "leotcede"

提示:

  • 元音字母不包含字母 "y" 。

友情链接

leetcode.com/problems/re…

思路解析

首先是 new 一个 HashSet<Character> 专门存储 10 个元音字母。和一个与字符串同等长度的空数组 result[ ],专门用于存储遍历后的元素值的。

定义两个指针分别指向一前一后两个元素。

每循环一次做如下判断:

  1. 当前指针指向元素是否是元音字母。前指针不是指向元音字母,就往后移动一位;后指针不是指向元音字母,就往前移动一位。同时分别将当前索引的值设置到 result 中;
  2. 当两个指针所指向的元素都是元音字母时,就将前后指针的索引对换位置后设置到 result 中。

循环结束后,所得到的 result 即为所求。

算法实现

class Solution {
    private final static HashSet<Character> vowelSet=new HashSet<>(
        Arrays.asList('a','e','i','o','u','A','E','I','O','U')
    );

    public String reverseVowels(String s) {
        if(s==null){
            return s;
        }
        char[] result=new char[s.length()];
        int i=0,j=s.length()-1;
        while(i<=j){
            char ci=s.charAt(i);
            char cj=s.charAt(j);
            if(!vowelSet.contains(ci)){
                result[i++]=ci;
            }else if(!vowelSet.contains(cj)){
                result[j--]=cj;
            }else {
                result[i++]=cj;
                result[j--]=ci;
            }
        }
        return new String(result);
    }
}

image.png

花样设计

还有一种很 charming 的实现方式。利用双指针,同时结合 StringBuilder 类一起使用,很妙。

class Solution {
    public String reverseVowels(String s) {
       StringBuilder sb=new StringBuilder();
       int j=s.length()-1;
       for(int i=0;i<s.length();i++){
           if("AEIOUaeiou".indexOf(s.charAt(i))!=-1){
               while(j>=0&&"AEIOUaeiou".indexOf(s.charAt(j))==-1){
                   j--;
               }
               sb.append(s.charAt(j));
               j--;
           }else{
               sb.append(s.charAt(i));
           }
       }
       return sb.toString();
    }
}

image.png