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

การกลับตัวอักษรสระในสตริงด้วย C++

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

ตัวอย่างอินพุต 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"