前言
本文旨在记录与分享个人的刷题经验,因水平受限,观点难免偏颇,欢迎大家在评论区交流意见
LeetCode 345. 反转字符串中的元音字母
给你一个字符串s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括'a' 、'e' 、'i' 、'o' 、'u' ,且可能以大小写两种形式出现。
示例 1:
输入:s = "hello"
输出:"holle"
示例 2:
输入:s = "leetcode"
输出:"leotcede"
提示:
1 <= s.length <= 3 * 105 s 由 可打印的 ASCII 字符组成
解法一:双指针法——
O
(
n
)
O(n)
O(n)
思路——双指针分别从两端往中间遍历,匹配并交换
分析:
- 平平无奇双指针,从两端往中间遍历,并匹配目标元素
- 任意指针匹配到了,就停下等另一个匹配
- 都匹配了,再交换元素,继续遍历
步骤——遍历取值
→
\rightarrow
→双方匹配
→
\rightarrow
→交换
- ①转换:首先,将字符串
s 用s.CharArray() 方法转换成字符数组 - ②设置目标字符串:将元音字符包括大小写全部存入目标字符串中
- ③双指针遍历匹配:左右指针向中间遍历,如果任意指针匹配到,则停下,直到两个指针都匹配到了,进行交换然后继续遍历
- ④注意点:
- Ⅰ.匹配方式——
str.indexof() != -1; 如果用str.contains() 则会匹配失败,原因是char cannot be converted to CharSequence - Ⅱ.返回值类型——记得返回
String 类型的值
代码实现:
class Solution {
public String reverseVowels(String s) {
String str ="aeiouAEIOU";
char[] ch = s.toCharArray();
int left = 0;
int right = s.length() - 1;
while(left < right){
while(left < s.length() - 1 && str.indexOf(ch[left]) < 0){
left++;
}
while(right > 0 && str.indexOf(ch[right]) < 0){
right--;
}
if(left < right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
return new String(ch);
}
}
复杂度分析——
O
(
n
)
O(n)
O(n)、
O
(
n
)
O(n)
O(n)
- 时间复杂度:
O
(
n
)
O(n)
O(n)——最坏需要遍历整个字符串
s 长度n - 空间复杂度:
O
(
n
)
O(n)
O(n)——创建了新的字符数组和字符串
结尾:
难度不大,但是侮辱性极强。在刚刷到这题的时候还没有标注元音字母和大小写……属实有些尴尬。至于优化,可以设置一个StringBulider 减少内存开销
|