Cho một chuỗi, nhiệm vụ là đảo ngược thứ tự các nguyên âm (vowels) trong chuỗi, các phụ âm giữ nguyên vị trí. Ví dụ:
Đầu vào 1: "tutor" → Đầu ra: "totur" (u, o → o, u).
Đầu vào 2: "mathematics" → Đầu ra: "mithametacs" (a, e, a, i → i, a, e, a).
Phương pháp: Two Pointers (Hai con trỏ)
Sử dụng hai con trỏ low (đầu) và high (cuối). Di chuyển low về phải cho đến khi gặp nguyên âm, di chuyển high về trái cho đến khi gặp nguyên âm. Hoán đổi hai ký tự đó. Lặp lại cho đến khi low >= high.
- Hàm
isVowel(char)kiểm tra nguyên âm (cả chữ hoa/thường). - Hàm
reverseVowel(string &)thực hiện đảo ngược tại chỗ.
Ví dụ mã nguồn
#include <bits/stdc++.h>
using namespace std;
bool isVowel(char ch) {
return ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u'||
ch=='A'||ch=='E'||ch=='I'||ch=='O'||ch=='U';
}
string reverseVowel(string &s) {
int low = 0, high = s.size() - 1;
while (low < high) {
while (low < high && !isVowel(s[low])) low++;
while (low < high && !isVowel(s[high])) high--;
swap(s[low++], s[high--]);
}
return s;
}
int main() {
string a = "tutorialspoint";
cout << reverseVowel(a);
return 0;
}
Kết quả
titorailspount
Chuỗi "tutorialspoint" sau khi đảo ngược nguyên âm thành "titorailspount".