LeetCode345——字符串专题/双指针专题(5)反转字符串中的元音字母

本文探讨了三种不同的方法来实现字符串中元音字母的反转:双指针配合HashSet、indexOf方法判断和StringBuffer的reverse。通过实例演示和代码实现,展示了每种方法的优缺点及适用场景。
摘要由CSDN通过智能技术生成

反转字符串中的元音字母

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入:“hello”
输出:“holle”
示例 2:
输入:“leetcode”
输出:“leotcede”
元音字母:AEIOU

(1)方法1:双指针+HashSet的contains方法

class Solution {
    public static String reverseVowels(String s){
        HashSet set = new HashSet();
        set.add('a');
        set.add('A');
        set.add('e');
        set.add('E');
        set.add('i');
        set.add('I');
        set.add('o');
        set.add('O');
        set.add('u');
        set.add('U');

        int len = s.length();
        char[] chars = s.toCharArray();
        int i = 0;
        int j = len - 1;
        while(i < j){
            while (i < j && !set.contains(chars[i])){
                //左指针不是元音字母,向右移动
                i++;
            }
            while (i < j && !set.contains(chars[j])){
                //右指针不是元音字母,向左移动
                j--;
            }
            //左右双指针指向元音字母的时候,就停止了,然后再判断两个位置的字母是否相等,不相等则交换
            if (chars[i] != chars[j]){
                char temp = chars[i];
                chars[i] = chars[j];
                chars[j] = temp;
            }
            //交换之后,将左指针右移,右指针左移
            i++;
            j--;
        }
        return new String(chars);
    }

    public static void main(String[] args){
        String s = "leetcode";
        System.out.println(reverseVowels(s));
    }
}

(2)方法2:双指针+字符串的indexOf方法判断字符是否存在

class Solution {
    public static String reverseVowels(String s){
        String news = "aeiouAEIOU";
        int len = s.length();
        char[] chars = s.toCharArray();
        int i = 0;
        int j = len - 1;
        while(i < j){
            while (i < j && news.indexOf(chars[i])==-1){
                //左指针不是元音字母,向右移动
                i++;
            }
            while (i < j && news.indexOf(chars[j])==-1){
                //右指针不是元音字母,向左移动
                j--;
            }
            //左右双指针指向元音字母的时候,就停止了,然后再判断两个位置的字母是否相等,不相等则交换
            if (chars[i] != chars[j]){
                char temp = chars[i];
                chars[i] = chars[j];
                chars[j] = temp;
            }
            //交换之后,将左指针右移,右指针左移
            i++;
            j--;
        }
        return new String(chars);
    }

    public static void main(String[] args){
        String s = "leetcode";
        System.out.println(reverseVowels(s));
        String s2 = "aA";
        System.out.println(reverseVowels(s2));
    }
}

(3)方法3:StringBuffer的reverse方法+switch语句

class Solution {
    public static String reverseVowels(String s){
        char[] chars = s.toCharArray();
        int len = s.length();
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<len; i++){
            switch (chars[i]){
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                case 'A':
                case 'E':
                case 'I':
                case 'O':
                case 'U':
                    sb.append(chars[i]);
                    break;
            }
        }
        char[] chars1 = sb.reverse().toString().toCharArray();
        int index = 0;
        for(int i=0; i<len; i++){
            switch (chars[i]){
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                case 'A':
                case 'E':
                case 'I':
                case 'O':
                case 'U':
                    chars[i] = chars1[index];
                    index++;
                    break;
            }
        }
        return new String(chars);
    }

    public static void main(String[] args){
        String s = "leetcode";
        System.out.println(reverseVowels(s));
        String s2 = "aA";
        System.out.println(reverseVowels(s2));
    }
}

方法1的思路:利用HastSet存取速度快的特点,将元音字母的大小写都存入set中,然后定义两个指针,一个指向字符数组的开头,一个指向字符数组的结尾,对每个指针指向的字符进行判断,这个字符是否在set中存在,如果存在就是元音字母,如果不存在就将指针移动,直到两个指针都停下指向元音字母,并且两个指针的字符不一致,进行交换,遍历结束条件为左指针下标小于右指针下标。
方法2的思路:和方法1一样,只不过使用字符串来存放的元音字母,利用了字符串的charOf方法来判断是不是元音字母。
方法3的思路:利用了StringBuffer和switch语句。先将字符串转换为字符数组,然后遍历字符数组,将元音字母添加到StringBuffer中,再利用字符串缓冲类的reverse方法进行反转,反转后转换为字符数组,再对原字符数组重新进行遍历,每当遇到元音字母,使用字符串缓冲类转换为的字符数组中的字符进行替换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值