3. 反转字符串中的元音字符
345. Reverse Vowels of a String (Easy)
Leetcode / 力扣
Given s = “leetcode”, return “leotcede”.
使用双指针,一个指针从头向尾遍历,一个指针从尾到头遍历,当两个指针都遍历到元音字符时,交换这两个元音字符。
为了快速判断一个字符是不是元音字符,我们将全部元音字符添加到集合 HashSet 中,从而以 O(1) 的时间复杂度进行该操作。
时间复杂度为 O(N):只需要遍历所有元素一次
空间复杂度 O(1):只需要使用两个额外变量
代码展示:
import java.util.Arrays;
import java.util.HashSet;
/**
* 3. 反转字符串中的元音字符
* 使用双指针进行快速遍历数组,一个指针从头开始遍历,一个指针从尾部开始遍历
* 使用hashset 将元音字母保存在集合中,实现快速比对
*/
public class DoublePointer3_reverseVowels {
public static void main(String[] args) {
// hashset 元音字母集合
HashSet vowels = new HashSet(Arrays.asList('a','o','e','i','u','A','O','E','I','U'));
String str = "leetcode";
if (str == null) return;
int i =0, j = str.length()-1;
//新集合,将调换后的str字符串存储在新的字符串中,
// 也可以进行临时参数调换,则不需要建立新字符串数组
char[] result = new char[str.length()];
while (i<=j){
char ci = str.charAt(i);
char cj = str.charAt(j);
//i++,先执行操作,在执行i=i+1,
if (!vowels.contains(ci)){
result[i++] = ci;
} else if(!vowels.contains(cj)){
result[j--] = cj;
} else {
result[i++] = cj;
result[j--] = ci;
}
}
System.out.println(result);
}
}