給定字符串 s,僅反轉其中的元音字母(a, e, i, o, u 不分大小寫),其他字符位置不變。
"hello" → "holle""leetcode" → "leotcede"左右指針 i=0, j=n-1 向中間掃描:
i 右移直到指向元音。j 左移直到指向元音。i < j,交換 s[i] 和 s[j],i++, j--。i >= j。bool isVowel(char c) {
c = tolower(c);
return c=='a' || c=='e' || c=='i' || c=='o' || c=='u';
}
char* reverseVowels(char* s) {
int i = 0, j = strlen(s) - 1;
while (i < j) {
while (i < j && !isVowel(s[i])) i++;
while (i < j && !isVowel(s[j])) j--;
if (i < j) {
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
i++; j--;
}
}
return s;
}
isVowel 輔助函數,避免冗長條件判斷重複。tolower 統一大小寫判斷。while 循環跳過非元音,邏輯清晰無冗餘分支。O(n),單次遍歷。O(1),原地修改。反轉元音字母是雙指針「對撞指針」模式的典型應用:左右掃描、跳過無關字符、相遇交換。同模式適用於「反轉字符串、移除元素、三數之和」等問題。