Bootstrap

【LeetCode】反转字符串中的元音字母Java题解

题目描述

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

示例 1:

输入:"hello"
输出:"holle"
示例 2:

输入:"leetcode"
输出:"leotcede"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-vowels-of-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的每日一题是简单题目,要求交换元音字母。题目中没有给出元音字母,搜索一下,元音字母是 aeiouAEIOU。理解了元音字母,题目就好解决了。

  • 下面的解法使用了双指针的技巧。双指针简单描述就是使用两个指针移动,提升遍历效率,一般应用在数组相关的题目中。

  • 常见的双指针有首尾指针,也就是从首,尾同时遍历,本题用到了这个解法。从首尾分别找元音字母,然后交换。这里有个需要注意的地方,在交换之后要使指针移动,指向下一个位置,才能使程序正确

  • 常见的双指针还有快慢指针,一般用来判断有没有环。

通过代码

class Solution {
    public String reverseVowels(String s) {
        int n = s.length();
        int left = 0;
        int right = n - 1;
        Set set = new HashSet<>();
        set.add('a');
        set.add('e');
        set.add('i');
        set.add('o');
        set.add('u');
        set.add('A');
        set.add('E');
        set.add('I');
        set.add('O');
        set.add('U');


        char[] arr = s.toCharArray();
        while (left < right) {
            if (left < n && !set.contains(arr[left])) {
                left++;
            }
            if (right >= 0 && !set.contains(arr[right])) {
                right--;
            }

            if (set.contains(arr[left]) && set.contains(arr[right])) {
                char temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
                left++;
                right--;
            }
        }

        return new String(arr);
    }
}

总结

  • 上述代码的时间复杂度是O(n), 空间复杂度是O(n)

  • 字符串题目还常常用来考察各位对编程语言API的熟悉程度。比如:trim(), split() 等函数使用,可以帮助我们简化代码,提升效率。需要大家熟悉。

  • 坚持算法每日一题,加油!