[数组双指针] 0345. 反转字符串中的元音字母
文章目录
- 1. 题目链接
- 2. 题目大意
- 3. 示例
- 4. 解题思路
- 5. 参考代码
1. 题目链接
345. 反转字符串中的元音字母 - 力扣(LeetCode)
2. 题目大意
描述:给定一个字符串 s。
要求:将字符串中的元音字母进行反转。
说明:
- 元音字母包括
'a'
、'e'
、'i'
、'o'
、'u'
,且可能以大小写两种形式出现不止一次。 - 1≤s.length≤3×105。
- s 由可打印的 ASCII 字符组成。
3. 示例
输入:s = "hello"
输出:"holle"
输入:s = "leetcode"
输出:"leotcede"
4. 解题思路
- 我们先将字符串转为数组。
- 使用两个指针 left,right。left 指向字符串开始位置,right 指向字符串结束位置。
- 然后 left 依次从左到右移动查找元音字母,right 依次从右到左查找元音字母。
- 如果都找到了元音字母,则交换字符,然后继续进行查找。
- 如果遇到 left==right 时停止。
- 最后返回对应的字符串即可。
5. 参考代码
class Solution {
public String reverseVowels(String s) {
int left = 0, right = s.length()-1;
char[] chars = s.toCharArray();
Set<Character> vowels = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
while(left < right){
// 从左往右
while(left<right && !vowels.contains(chars[left])){
left++;
}
//从右往左
while(left<right && !vowels.contains(chars[right])){
right--;
}
// 双指针相遇则退出
if(left >= right) break;
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
return new String(chars);
}