力扣第30刷-反转字符串中的元音字母

简介: 力扣第30刷-反转字符串中的元音字母

Example 30

反转字符串中的元音字母

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

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

示例 1:

输入:s = "hello"

输出:"holle"

示例 2:

输入:s = "leetcode"

输出:"leotcede"

解题思路:使用指针i和j对字符串相向地进行遍历。

具体地,指针i初始时指向字符串s的首位,指针j初始时指向字符串s的末位。在遍历的过程中,不停地将i向右移动,直到i指向一个元音字母(或者i>j)同时,不停地将j向左移动,直到j指向一个元音字母(或者i>j)。此时,如果i<j,那么交换i和j指向的元音字母,否则说明所有的元音字母均已遍历过,可以退出遍历。

解题步骤:

1. 定义变量n记录字符串s的长度。

2. 将字符串转换为char型的数组。

3. 定义双指针i、j,分别从数组左右两侧遍历考察元音字母,初始值分别为0和n - 1。

4. 定义外部while循环,i<j时,说明数组还未考察完毕,进入while循环继续处理,否则说明数组已经考察完毕,使用String的构造方法将处理过后的数组arr转换为String字符串并返回。

5. 在外部while内,首先定义第一个内部while循环,若左指针i小于右指针j且数组中左指针指向的第i个元素不为元音字母,则令i自加一,考察下一个索引位置的元素,否则说明i≥j,即已经考察完所有的元素或者左指针指向的第i个元素为元音字母,退出该内部while循环。

6. 同理,定义第二个内部while循环。

7. 两个内部while循环结束后,可能出现两种情况:①i≥j②左、右指针指向的元素均为元音字母。因此,判断i是否小于j,若是,则说明是情况②,则将i、j元素位置调换,即反转元音字母,并将i自加一,j自减一,考察左指针后一个元素以及右指针前一个元素,否则说明是情况①,不做任何操作,在下一轮while循环判断时,跳出外部while循环。

8. 其中涉及到考察元素是否为元音字母的方法isVowel,若某个元素属于元音字母,则其在字符串”aeiouAEIOU”中的索引一定是大于等于0的,因此若索引大于等于0,则该字符一定是元音字母,返回true,否则说明该字符为辅音字母,返回false;交换元素位置的方法swap,在给定的数组中,将给定的两个索引位置的元素对调位置。

 

示例代码如下:

public class ReverseVowelsOfString {
    /**
     * 给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
     * 元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现。
     * 示例 1:
     * 输入:s = "hello"
     * 输出:"holle"
     * 示例 2:
     * 输入:s = "leetcode"
     * 输出:"leotcede"
     * 来源:力扣(LeetCode)
     * 链接:https://leetcode.cn/problems/reverse-vowels-of-a-string
     */
    public static void main(String[] args) {
        ReverseVowelsOfString rvos = new ReverseVowelsOfString();
        System.out.println(rvos.reverseVowels("hello")); // holle
    }
    /**
     * 官方(个人修改后)
     *
     * @param s
     * @return
     */
    public String reverseVowels(String s) {
        int n = s.length();
        char[] arr = s.toCharArray();
        int i = 0, j = n - 1;
        while (i < j) {
            while (i < j && !isVowel(arr[i])) { // 原官方: while (i < n && !isVowel(arr[i])) {
                ++i;
            }
            while (i < j && !isVowel(arr[j])) { // 原官方:while (j > 0 && !isVowel(arr[j])) {
                --j;
            }
            if (i < j) {
                swap(arr, i, j);
                ++i;
                --j;
            }
        }
        return new String(arr);
    }
    public boolean isVowel(char ch) {
        return "aeiouAEIOU".indexOf(ch) >= 0;
    }
    public void swap(char[] arr, int i, int j) {
        char temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    /**
     * 个人
     * @param s
     * @return
     */
    /*public String reverseVowels(String s) {
        List<Character> vowels = new ArrayList<>();
        vowels.add('A');
        vowels.add('E');
        vowels.add('I');
        vowels.add('O');
        vowels.add('U');
        vowels.add('a');
        vowels.add('e');
        vowels.add('i');
        vowels.add('o');
        vowels.add('u');
        char[] sChar = s.toCharArray();
        int length = sChar.length;
        char temp;
        int left = 0, right = length - 1;
        while (left < right) {
            while (!vowels.contains(sChar[left]) && left < right) {
                left++;
            }
            while (!vowels.contains(sChar[right]) && left < right) {
                right--;
            }
            if (left >= right) break;
            temp = sChar[left];
            sChar[left] = sChar[right];
            sChar[right] = temp;
            left++;
            right--;
        }
        String s2 = "";
        for (char c : sChar) {
            s2 += c;
        }
        return s2;
    }*/
}
相关文章
|
4月前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
2月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
37 1
|
2月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
25 9
|
2月前
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
17 1
|
2月前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
23 0
Leetcode第十七题(电话号码的字母组合)
|
2月前
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
19 0
【LeetCode 11】242.有效的字母异位词
|
2月前
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
42 0
|
2月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
21 0
|
2月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
31 0
|
2月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
21 0