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

it2025-11-08  11

反转字符串中的元音字母

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。 示例 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方法进行反转,反转后转换为字符数组,再对原字符数组重新进行遍历,每当遇到元音字母,使用字符串缓冲类转换为的字符数组中的字符进行替换。

最新回复(0)