开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第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 字符组成
二、思路分析:
虽然是一套简单的题目,但是移动的技巧性是比较强的,如果没有想到,想要通过所有用例,还是没有那么简单的。 首先:最好把String转义为char数组,方便后续的扫描; 其次: 1、左移动的时机:在左元素是非元音字符的情况下,尽可能的向右移动,直到遇到元音字符停下; 2、右移动的时机:在右元素是非元音字符的情况下,尽可能的向左移动,直到遇到元音字符停下; 3、这时,如果left<right,那么比如left是一个元音,right是另外一个元音,交换位置; 4、在left<right时,重复以上逻辑即可。
三、AC 代码:
class Solution {
public String reverseVowels(String s) {
int left = 0;
int right = s.length() - 1;
set.addAll(Arrays.asList(new Character[] {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}));
char[] arr = s.toCharArray();
while (left < right) {
while (left < s.length() && !isValid(s.charAt(left))) {
left++;
}
while (right > 0 && !isValid(s.charAt(right))) {
right--;
}
if (left < right) {
swap(arr, left, right);
left++;
right--;
}
}
return new String(arr);
}
private void swap(char[] arr, int left, int right) {
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
Set<Character> set = new HashSet<>();
private boolean isValid(char ch) {
return set.contains(ch);
}
}
四、总结:
常规的双指针操作了。
五、参考:
JavaScript双指针练习(五)——反转字符串中的元音字母 - 反转字符串中的元音字母 - 力扣(LeetCode)
java ,接近双百。用char[]数组接String字符串。双指针,两指针分别碰到元音停止,都停止了交换,再各自自增自减 - 反转字符串中的元音字母 - 力扣(LeetCode)