题目描述
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例1:
输入: s = “hello”
输出: “holle”
示例2:
输入: s = “leetcode”
输出: “leotcede”
思路分析
难度是简单 ,我们首先要明确元音字母的涵盖范围{a, e, i, o, u}
,之后就是常规的条件判断是否为元音和反转元音字符操作了,这里需要进一步思考的是反转字符,这里我们观察两个示例,发现当交换对的字符均为原因字母时才会触发交换,故我们这里罗列出步骤:
- 判断字符是否为元音字母;
- 判断倒序字符是否为元音字母;
- 若是,则交换并向前搜索;否则向前搜索;
即交换相向位置的元音字符,这里我们借用集合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。