日新计划345. 反转字符串中的元音字母

90 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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)