算法修炼之路—【字符串】Leetcode 345 反转字符串中的元音字母

文章目录

  • 题目描述
    • 思路分析
    • 解题代码
    • 复杂度分析
    • Github源码

题目描述

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

示例1:

输入: s = “hello”
输出: “holle”

示例2:

输入: s = “leetcode”
输出: “leotcede”

思路分析

难度是简单 ,我们首先要明确元音字母的涵盖范围{a, e, i, o, u},之后就是常规的条件判断是否为元音反转元音字符操作了,这里需要进一步思考的是反转字符,这里我们观察两个示例,发现当交换对的字符均为原因字母时才会触发交换,故我们这里罗列出步骤:

  1. 判断字符是否为元音字母;
  2. 判断倒序字符是否为元音字母;
  3. 若是,则交换并向前搜索;否则向前搜索;

交换相向位置的元音字符,这里我们借用集合set 对有限元音字符进行存储,方便元音判断;这里直接给代码:

解题代码

    public static String solution(String s) {
        if (s == null || s.length() < 2) {
            return s;
        }

        Set<Character> set = new HashSet<>();
        set.add('a');
        set.add('e');
        set.add('i');
        set.add('o');
        set.add('u');

        char[] res = s.toCharArray();

        for (int i = 0, j = s.length() - 1; i < j;) {
            if (set.contains(res[i])) {
                if (set.contains(res[j])) {
                    if (res[i] != res[j]) {
                        char tmpC = res[i];
                        res[i] = res[j];
                        res[j] = tmpC;
                    }
                    i++;
                    j--;
                } else
                    j--;
                
            } else
                i++;
            
        }
        return new String(res);
    }

复杂度分析

这里我们设n为输入字符数组的长度,l个元音字符;

时间复杂度: 我们对数组进行了n次访问,比较并交换了l个字符,故时间复杂度为O(n);
空间复杂度: 我们使用了set存储元音,但其不随n变化,故为常量级;res为返回值容器,故空间复杂度为O(n);

Github源码

完整可运行文件请访问GitHub。

你可能感兴趣的:(算法修炼之路)