Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ย้อนกลับสระของสตริงใน C ++


เมื่อได้รับสตริง ภารกิจคือการกลับสระทั้งหมดที่มีอยู่ในสตริงที่กำหนด ตัวอย่างเช่น

อินพุต-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”