给你一个字符串 s
,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'
、'e'
、'i'
、'o'
、'u'
,且可能以大小写两种形式出现不止一次。
示例 1:
输入:s = "hello" 输出:"holle"
示例 2:
输入:s = "leetcode" 输出:"leotcede"
提示:
1 <= s.length <= 3 * 10^5
s
由 可打印的 ASCII 字符组成
解法:对撞指针
Java版:
class Solution {
public String reverseVowels(String s) {
int n = s.length();
char[] arr = s.toCharArray();
int l = 0;
int r = n - 1;
while (l < r) {
while (l < r && !isVowel(arr[l])) {
l++;
}
while (r > l && !isVowel(arr[r])) {
r--;
}
if (l < r) {
swap(arr, l, r);
l++;
r--;
}
}
return new String(arr);
}
private boolean isVowel(char c) {
return "aeiouAEIOU".indexOf(c) >= 0;
}
private void swap(char[] arr, int i, int j) {
char temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
Python版:
class Solution:
def reverseVowels(self, s: str) -> str:
def isVowel(c: str) -> bool:
return c in "aeiouAEIOU"
n = len(s)
s = list(s)
l = 0
r = n - 1
while l < r:
while l < r and not isVowel(s[l]):
l += 1
while l < r and not isVowel(s[r]):
r -= 1
if l < r:
s[l], s[r] = s[r], s[l]
l += 1
r -= 1
return "".join(s)
复杂度分析
- 时间复杂度:O(n),其中 n 是数组的长度。
- 空间复杂度:O(1) 或 O(n),取决于使用的语言中字符串类型的性质。如果字符串是可修改的,那么我们可以直接在字符串上使用双指针进行交换,空间复杂度为 O(1),否则需要使用 O(n) 的空间将字符串临时转换为可以修改的数据结构(例如数组),空间复杂度为 O(n)。