这是我参与更文挑战的第11天,活动详情查看: 更文挑战
345. 反转字符串中的元音字母
题目描述
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入:"hello"
输出:"holle"
示例 2:
输入: "leetcode"
输出: "leotcede"
提示:
- 元音字母不包含字母 "y" 。
友情链接
思路解析
首先是 new 一个 HashSet<Character> 专门存储 10 个元音字母。和一个与字符串同等长度的空数组 result[ ],专门用于存储遍历后的元素值的。
定义两个指针分别指向一前一后两个元素。
每循环一次做如下判断:
- 当前指针指向元素是否是元音字母。前指针不是指向元音字母,就往后移动一位;后指针不是指向元音字母,就往前移动一位。同时分别将当前索引的值设置到 result 中;
- 当两个指针所指向的元素都是元音字母时,就将前后指针的索引对换位置后设置到 result 中。
循环结束后,所得到的 result 即为所求。
算法实现
class Solution {
private final static HashSet<Character> vowelSet=new HashSet<>(
Arrays.asList('a','e','i','o','u','A','E','I','O','U')
);
public String reverseVowels(String s) {
if(s==null){
return s;
}
char[] result=new char[s.length()];
int i=0,j=s.length()-1;
while(i<=j){
char ci=s.charAt(i);
char cj=s.charAt(j);
if(!vowelSet.contains(ci)){
result[i++]=ci;
}else if(!vowelSet.contains(cj)){
result[j--]=cj;
}else {
result[i++]=cj;
result[j--]=ci;
}
}
return new String(result);
}
}
花样设计
还有一种很 charming 的实现方式。利用双指针,同时结合 StringBuilder 类一起使用,很妙。
class Solution {
public String reverseVowels(String s) {
StringBuilder sb=new StringBuilder();
int j=s.length()-1;
for(int i=0;i<s.length();i++){
if("AEIOUaeiou".indexOf(s.charAt(i))!=-1){
while(j>=0&&"AEIOUaeiou".indexOf(s.charAt(j))==-1){
j--;
}
sb.append(s.charAt(j));
j--;
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}