前言
继续字符串刷题之旅!本题难度为简单,利用双指针也是完成了多种解法,但是解法较他人的稍复杂,接下来先介绍我自己的解法,然后再总结一种优化解法。
题目描述
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入:“hello”
输出:“holle”
示例 2:
输入:“leetcode”
输出:“leotcede”
思路
关于反转问题,首先要想到的是使用双指针来解题,然后按照这个思路接着往下想,需要使用左右指针分别指向符合条件的字符,然后进行反转。
解法一:
我们需要对元音字母进行存储记录,然后在遍历给定字符串时,将其中元音字母的下标记录到一个集合中,最后根据集合保存的下标进行反转操作。
算法流程:
- 初始化:HashSet 用来存储元音字母(这里要注意的是,要包括大写),ArrayList 用来存储给定字符串中元音字母所在位置。
- 遍历字符串:将给定字符串中元音字母所在的位置记录到 ArrayList 中。
- 设置左右指针,根据所保存的元音字母位置开始反转。
class Solution {
public String reverseVowels(String s) {
char[] charArr = s.toCharArray();
HashSet<Character> charSet = new HashSet<>();
List<Integer> indexList = new ArrayList<>();
charSet.add('a'); charSet.add('A');
charSet.add('e'); charSet.add('E');
charSet.add('i'); charSet.add('I');
charSet.add('o'); charSet.add('O');
charSet.add('u'); charSet.add('U');
for(int i = 0;i < charArr.length;i++){
char c = charArr[i];
if(charSet.contains(c)){
indexList.add(i);
}
}
int start = 0;
int end = indexList.size() - 1;
while(start < end){
char temp = charArr[indexList.get(start)];
charArr[indexList.get(start)] = charArr[indexList.get(end)];
charArr[indexList.get(end)] = temp;
start++;
end--;
}
return new String(charArr);
}
}
解法二:
在解法一的基础上,仅需使用一次遍历字符串操作即可完成反转。也就是说,在遍历字符串时,寻找元音字母和反转操作放在一起执行。先找到左右两边的元音字母,然后对其进行反转。
算法流程:
- 初始化:HashSet 用来存储元音字母(这里要注意的是,要包括大写);设置左右指针,左起0,右至字符数组长度减一。
- 遍历字符串:使用循环找出字符串左右两边符合条件的元音字母,然后进行反转。循环执行,直至退出循环。
class Solution {
public String reverseVowels(String s) {
char[] charArr = s.toCharArray();
HashSet<Character> charSet = new HashSet<>();
charSet.add('a'); charSet.add('A');
charSet.add('e'); charSet.add('E');
charSet.add('i'); charSet.add('I');
charSet.add('o'); charSet.add('O');
charSet.add('u'); charSet.add('U');
int start = 0;
int end = charArr.length - 1;
while(start < end){
// 寻找左边的元音字母
while(start < end && !charSet.contains(charArr[start])){start++;}
// 寻找右边的元音字母
while(start < end && !charSet.contains(charArr[end])){end--;}
// 反转符合条件的两个元音字母
char temp = charArr[start];
charArr[start] = charArr[end];
charArr[end] = temp;
start++;
end--;
}
return new String(charArr);
}
}