元音字母按照从外到内成对的方式反转,不考虑出现的元音字母个数为奇数的情况
双指针:指针1由左向右遍历,指针2由右向左遍历,某个指针指向元音字母时停止,直到它另一个指针也指向元音字母,此时两个指针指向的字母发生交换,交换后,再次按原来的方向遍历,如果指针2 < 指针1,那么说明整个字符串都被遍历,结束遍历
对于交换的条件:一开始的想法是vowel.indexOf(str[i]) >= 0 && vowel.indexOf(str[j]) >= 0 。因为结束条件有外围的 i < j 保证,跑出来发现不对。在交换后i+1,j-1后仍然保持 i < j ,进入循环,进入循环的后一轮i增加、j减少,i > j,i遇到处于后面的元音字母,j遇到处于前面的元音字母,此时二者再次发生交换,交换两次=没交换。所以交换的条件为i < j
代码
import org.junit.Test;
public class RollbackVowel {
@Test
public void test() {
String s = "hello";
String s1 = "leetcode";
System.out.println(rollbackVowel(s));
System.out.println(rollbackVowel(s1));
}
//vowel.indexOf(str[i]) >= 0表示str[i]上的字符是元音字母
//vowel.indexOf(str[i]) < 0表示str[i]上的字符不是元音字母
public static String rollbackVowel(String string) {
String vowel = "aeiouAEIOU";
char[] str = string.toCharArray();
int i = 0, j = str.length - 1;
while (i < j) {
while (i < str.length && vowel.indexOf(str[i]) < 0) {
i++;
}
while (j > 0 && vowel.indexOf(str[j]) < 0) {
j--;
}
if (i < j) {
swap(str, i, j);
i++;
j--;
}
}
return new String(str);
}
public static void swap(char[] arr, int i, int j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}