ได้รับสตริง งานคือกลับตัวอักษรสระทั้งหมดที่มีอยู่ในสตริงที่กำหนด ตัวอย่างเช่น
ตัวอย่างอินพุต 1
a = "tutor"
เอาต์พุต
totur
คำอธิบาย
การกลับสตริง "tutor" จะสร้างเอาต์พุตเป็น "totur"
ตัวอย่างอินพุต 2
a = "mathematics"
เอาต์พุต
mithametacs
คำอธิบาย
การกลับสตริง "mathematics" จะสร้างเอาต์พุตเป็น "mithametacs"
วิธีการแก้ปัญหา
ได้รับสตริง เราต้องกลับตัวอักษรสระทั้งหมดที่มีอยู่ในมัน มีหลายวิธีในการแก้ปัญหานี้แต่เราต้องแก้ในเวลา O(n) แบบเส้นตรง
ดังนั้น วิธีที่ดีกว่าในการแก้ปัญหานี้คือใช้ Two-Pointer Approach ซึ่งเราจะใช้ตัวชี้สองตัวคือ low และ high ซึ่งจะชี้ไปที่องค์ประกอบซ้ายสุดและขวาสุดในตอนแรก ในลูปซ้อนสองชั้น เราจะตรวจสอบว่าตัวอักษรทางซ้ายสุดเป็นสระและตัวอักษรทางขวาสุดเป็นสระด้วย แล้วสลับองค์ประกอบและเลื่อนตัวชี้ขวา
- รับอินพุตสตริง
- ฟังก์ชัน Boolean เพื่อตรวจสอบว่าตัวอักษรเป็นสระหรือไม่
- ฟังก์ชัน reverseVowel(string &str) รับสตริงเป็นอินพุตและกลับตัวอักษรสระที่มีอยู่ในสตริง
- เริ่มต้นตัวชี้สองตัว low และ high ซึ่งชี้ไปที่ '0' และตัวอักษรสุดท้ายตามลำดับ
- ตรวจสอบตัวอักษรทางซ้ายสุดและขวาสุด ถ้าเป็นสระ ให้สลับตัวอักษรแบบ in-place และลดตัวชี้ขวาสุด
- ทำซ้ำขั้นตอนจนกว่าจะเยี่ยมชมตัวอักษรทั้งหมดของสตริง
ตัวอย่างโค้ด
#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;
int 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";
string ans = reverseVowel(a);
cout << ans;
return 0;
}
ผลลัพธ์
การรันโค้ดด้านบนจะสร้างเอาต์พุตเป็น
titorailspount
เนื่องจากสตริงที่กำหนด "tutorialspoint" มีตัวอักษรสระ หลังจากกลับตัวอักษรสระ จะสร้างเอาต์พุตเป็น "titorailspount"