力扣第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天前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
36 6
|
4天前
leetcode代码记录(第一个出现两次的字母
leetcode代码记录(第一个出现两次的字母
11 2
|
4天前
leetcode代码记录(有效的字母异位词
leetcode代码记录(有效的字母异位词
10 1
|
4天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
4天前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
12 0
|
4天前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
25 1
|
4天前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
4天前
|
机器学习/深度学习 索引
【力扣】387. 字符串中的第一个唯一字符
【力扣】387. 字符串中的第一个唯一字符
|
4天前
【力扣】1832.判断句子是否为全字母句
【力扣】1832.判断句子是否为全字母句