📅  最后修改于: 2023-12-03 14:50:48.380000             🧑  作者: Mango
给定一个字符串,将所有的元音字母翻转。
输入字符串$s$,其中$1\leq |s| \leq 5000$。
输出翻转所有元音字母后的字符串。
输入:
hello world
输出:
hollo werld
我们可以遍历输入的字符串$s$中的每一个字符,判断它是否为元音字母,如果是,则进行翻转。元音字母包括$a$、$e$、$i$、$o$、$u$。
为了方便字符串的修改,我们可以将字符串$s$转换为字符数组$ch$来处理。对于可变的字符数组的处理,常见的方式是使用双指针,一个指针指向字符数组的起始位置,另一个指针指向字符数组的末尾位置,在不断向中间靠拢的过程中进行处理。
public String reverseVowels(String s) {
char[] ch = s.toCharArray();
int left = 0, right = ch.length-1;
while (left < right) {
while (left < right && !isVowel(ch[left])) {
left++;
}
while (left < right && !isVowel(ch[right])) {
right--;
}
if (left < right) {
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
return new String(ch);
}
private boolean isVowel(char ch) {
return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' || ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U';
}
在主函数中,我们调用$reverseVowels$函数,并输出结果:
public static void main(String[] args) {
String s = "hello world";
Solution solution = new Solution();
String result = solution.reverseVowels(s);
System.out.println(result);
}
输出结果为:
hollo werld
遍历一遍字符串的时间复杂度为$O(n)$,其中$n$为字符串的长度。由于我们使用了额外的字符数组进行处理,空间复杂度为$O(n)$。