携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
一、题目描述:
345. 反转字符串中的元音字母 - 力扣(LeetCode) (leetcode-cn.com)
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现。
示例 1:
输入:s = "hello"
输出:"holle"
示例 2:
输入:s = "leetcode"
输出:"leotcede"
提示:
- 1 <= s.length <= 3 * 10^5
- s 由 可打印的 ASCII 字符组成
二、思路分析:
采用双指针中的两端指针的思想,有几个点要考虑:
- 元音字母不仅包含小写字母,要考虑到。使用HashSet进行元音字母的存储,使用contains进行存在性比较。
- 进行字符类型的调换时,不能使用charAt()这个函数只是用来展示用的,由于String类型的不可修改性。要进行位置调换,只能将字符串转换为字符数组或使用StringBuilder进行操作。
思路:两端指针,其中有一端指向的不是元音字符,则对向的指针向自己移动,如果两指针均指向元音字母,则进行调换,最后将字符数组转换为String类型进行输出。
三、AC 代码:
class Solution {
HashSet<Character> yuanyin= new HashSet<>(){
{//创建set集合,用来存储元音字符,方便后面contains使用
add('a');
add('e');
add('i');
add('o');
add('u');
add('A');
add('E');
add('I');
add('O');
add('U');
}
};
public String reverseVowels(String s) {
int left=0;
int right=s.length()-1;
char[] a=s.toCharArray();
while(left<right){
if(yuanyin.contains(a[left])&&yuanyin.contains(a[right])){
char tmp;
tmp=a[left];
//这里不能使用charAt(),因为String是不可修改的类型,所以不能直接对其进行修改
a[left]=a[right];
a[right]=tmp;
left++;
right--;
}
else if(yuanyin.contains(s.charAt(left)))
right--;
else
left++;
}
return new String(a);
}
}
四、参考:
java ,接近双百。用char[]数组接String字符串。双指针,两指针分别碰到元音停止,都停止了交换,再各自自增自减 - 反转字符串中的元音字母 - 力扣(LeetCode)