เมื่อได้รับสตริง ภารกิจคือการกลับสระทั้งหมดที่มีอยู่ในสตริงที่กำหนด ตัวอย่างเช่น
อินพุต-1 −
a = “tutor”
ผลผลิต −
totur
คำอธิบาย − การกลับสตริง “tutor” จะสร้างผลลัพธ์เป็น “totur
อินพุต-2 −
a = “mathematics”
ผลผลิต −
mithametacs
คำอธิบาย - การย้อนกลับสตริง "คณิตศาสตร์" จะสร้างผลลัพธ์เป็น "mithametacs"
แนวทางการแก้ปัญหานี้
ให้สตริง เราต้องกลับสระทั้งหมดที่มีอยู่ในนั้น มีหลายวิธีในการแก้ปัญหานี้โดยเฉพาะ แต่เราต้องแก้ปัญหานี้ในเวลาเชิงเส้น O(n)
ดังนั้น วิธีที่ดีกว่าในการแก้ปัญหานี้คือการใช้แนวทางสองจุด ซึ่งเราจะใช้ตัวชี้สองตัวที่ต่ำและสูง ซึ่งจะชี้ไปที่องค์ประกอบซ้ายสุดและองค์ประกอบขวาสุดในขั้นต้น ในสองลูปที่ซ้อนกัน เราจะตรวจสอบว่าอักขระที่อยู่ซ้ายสุดเป็นสระหรือไม่ และอักขระขวาสุดคือสระด้วย จากนั้นจึงสลับองค์ประกอบและเลื่อนตัวชี้ไปทางขวา
-
รับอินพุตสตริง
-
ฟังก์ชันบูลีนเพื่อตรวจสอบว่าตัวละครนั้นเป็นสระหรือไม่
-
ฟังก์ชัน reverseVowel(string &str) รับสตริงเป็นอินพุตและย้อนกลับสระที่อยู่ในสตริง
-
เริ่มต้นตัวชี้สองตัวที่ต่ำและสูงซึ่งชี้ไปที่ '0' และอักขระตัวสุดท้ายตามลำดับ
-
ตรวจสอบอักขระซ้ายสุดและขวาสุดว่าเป็นสระหรือไม่ จากนั้นสลับอักขระในตำแหน่งและลดตัวชี้ขวาสุด
-
ทำซ้ำขั้นตอนต่างๆ จนกว่าจะไม่พบอักขระทั้งหมดของสตริง
ตัวอย่าง
#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”