나는 스택에 쌓아놓고 역순으로 뺐다.
다른 풀이법으로는 left, right 두 가지 포인터로 양쪽 끝부터 탐색하면서 둘 다 모음인 경우 둘이 바꾸는 방법이 있음
이러나 저러나 선형 탐색(O(n)) 시간이기 때문에 큰 의미는 없을 것 같은데, 후자의 경우 한번만 돌아도 되는 점은 이득
참고로 아스키 코드를 128자리 배열을 만들어 관리하면 wrapping/unwrapping 비용이 들지 않기 때문에 더 빨라질 수도 있다.
class Solution {
public String reverseVowels(String s) {
String vowels = "AEIOUaeiou";
Stack<Character> vowelsStack = new Stack<>();
char[] arr = s.toCharArray();
for (int i=0; i<arr.length; i++) {
if (vowels.indexOf(arr[i]) != -1) {
vowelsStack.push(arr[i]);
}
}
for (int i=0; i<arr.length; i++) {
if (vowels.indexOf(arr[i]) != -1) {
arr[i] = vowelsStack.pop();
}
}
return new String(arr);
}
}