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; }*/ }