給你一個下標從?0?開始的字符串?s
?,將?s
?中的元素重新?排列?得到新的字符串?t
?,它滿足:
- 所有輔音字母都在原來的位置上。更正式的,如果滿足?
0 <= i < s.length
?的下標?i
?處的?s[i]
?是個輔音字母,那么?t[i] = s[i]
?。 - 元音字母都必須以他們的?ASCII?值按?非遞減?順序排列。更正式的,對于滿足?
0 <= i < j < s.length
?的下標?i
?和?j
? ,如果?s[i]
?和?s[j]
?都是元音字母,那么?t[i]
?的 ASCII 值不能大于?t[j]
?的 ASCII 值。
請你返回結果字母串。
元音字母為?'a'
?,'e'
?,'i'
?,'o'
?和?'u'
?,它們可能是小寫字母也可能是大寫字母,輔音字母是除了這 5 個字母以外的所有字母。
示例 1:
輸入:s = "lEetcOde" 輸出:"lEOtcede" 解釋:'E' ,'O' 和 'e' 是 s 中的元音字母,'l' ,'t' ,'c' 和 'd' 是所有的輔音。將元音字母按照 ASCII 值排序,輔音字母留在原地。
示例 2:
輸入:s = "lYmpH" 輸出:"lYmpH" 解釋:s 中沒有元音字母(s 中都為輔音字母),所以我們返回 "lYmpH" 。
提示:
1 <= s.length <= 10^5
s
?只包含英語字母表中的?大寫?和?小寫?字母。
分析:先遍歷字符串 s,記錄所有出現過的元音字母,再將所有的元音字母按照 ASCII 碼從小到大排序。之后遍歷 s,碰到元音字母則從記錄元音字母的數組中取出一個替換,直到遍歷完 s 即可。
int cmp(const void *a,const void *b)
{char *aa=(char*)a;char *bb=(char*)b;return *aa-*bb;
}
char* sortVowels(char* s) {int t=0;char ss[100010]={0};for(int i=0;s[i];++i){char temp=tolower(s[i]);if(temp=='a'||temp=='e'||temp=='i'||temp=='o'||temp=='u')ss[t++]=s[i];}qsort(ss,t,sizeof(char),cmp);for(int i=0,ind=0;s[i];++i){char temp=tolower(s[i]);if(temp=='a'||temp=='e'||temp=='i'||temp=='o'||temp=='u')s[i]=ss[ind],ind++;}return s;
}