【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() 等函数使用,可以帮助我们简化代码,提升效率。需要大家熟悉。
坚持算法每日一题,加油!