力扣第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;
    }*/
}
相关文章
|
7月前
|
存储 算法 Go
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
LeetCode 17题解题思路采用回溯算法,通过递归构建所有可能的组合。关键点包括:每位数字对应多个字母,依次尝试;递归构建下一个字符;递归出口为组合长度等于输入数字长度。Go语言实现中,使用map存储数字到字母的映射,通过回溯函数递归生成组合。时间复杂度为O(3^n * 4^m),空间复杂度为O(n)。类似题目包括括号生成、组合、全排列等。掌握回溯法的核心思想,能够解决多种排列组合问题。
315 11
|
8月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
222 6
|
9月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
317 11
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
125 9
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
173 1
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
98 1
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
142 0
Leetcode第十七题(电话号码的字母组合)
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
122 0
【LeetCode 11】242.有效的字母异位词
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
155 0