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