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

เขียนโปรแกรมในภาษา C++ เพื่อแยกสองสตริงให้เป็น palindrome


สตริงจะเรียกว่าสตริงพาลินโดรมหากมันยังคงเหมือนเดิมหลังจากย้อนกลับ

ในปัญหาเฉพาะนี้ เราได้ให้สตริง 'a' และ 'b' สองสตริงที่มีความยาวเท่ากัน หากถูกแบ่งด้วยดัชนีบางรายการ ภารกิจคือตรวจสอบว่าผลรวมของสตริงสร้างพาลินโดรมหรือไม่

สมมติว่าเรามีสตริง 'a' และ 'b' สองสตริงที่มีความยาว '4' และหลังจากแยกสตริงทั้งสองที่ดัชนี '3' ออกแล้ว

aaa | ข และ bbb | ก

aaa (ส่วนนำหน้าของสตริงแรก) + a (ส่วนต่อท้ายของสตริงที่สอง) ควรเป็น Palindrome

หรือ

b (คำต่อท้ายของสตริงแรก) + bbb (คำนำหน้าของสตริงที่สอง) ควรเป็น Palindrome

ตัวอย่าง

อินพุต-1:

a = “abcdef”

b = “fedcba”

ผลลัพธ์:

True

คำอธิบาย: หลังจากแยกสตริง 'a' และสตริง 'b' ที่ดัชนี '2' แล้ว พวกมันจะกลายเป็น

abc | def และ fed | ซีบีเอ

เช่นนั้น abc (คำนำหน้าของสตริงแรก) + cba (ส่วนต่อท้ายของสตริงที่สอง) ทำให้สตริงพาลินโดรม ดังนั้นเราจะคืน "ความจริง" กลับคืนมา

อินพุต-2:

a =  “eatable”

b =  “tableau”

ผลลัพธ์:

False

คำอธิบาย: ไม่มีทางเป็นไปได้ที่จะทำให้สองสายนี้ palindrome

แนวทางในการแก้ปัญหานี้

เพื่อแก้ปัญหานี้โดยเฉพาะ เราจะใช้วิธีการแบบสองตัวชี้ ในแนวทางนี้ อันดับแรก เราจะเริ่มต้นตัวชี้สองตัว คือ ต่ำและสูง โดยให้จุดต่ำเป็น '0' และจุดสูงไปยังอักขระตัวสุดท้ายของสตริง

เนื่องจากความยาวของสตริงทั้งสองเท่ากัน เราจะตรวจสอบว่ามีอักขระตัวใดตัวหนึ่งน้อยกว่า 2 ตัวหรือไม่ ถ้าใช่ เราจะคืนค่า True มิฉะนั้น เราจะตรวจสอบแบบเรียกซ้ำโดยวนซ้ำทั้งสตริงโดยใช้พอยน์เตอร์ หากสตริงทั้งสองเท่ากัน ให้คืนค่า True ไม่เช่นนั้นจะเป็นเท็จ

  • ใช้สองสตริง 'a' และ 'b' ตามลำดับ
  • ฟังก์ชันบูลีน checkPalindromic(สตริง a, สตริง b) รับสองสตริงเป็นพารามิเตอร์อินพุตและส่งกลับค่า True หรือ False ตามลำดับ
  • เริ่มต้นตัวชี้สองตัว ต่ำและสูง โดยมีค่าต่ำ =0 และสูง =ความยาวของสตริง 'b'
  • วนซ้ำบนสตริงและตรวจสอบว่าอักขระของทั้งสองสตริงเท่ากันหรือไม่
  • การแยกฟังก์ชันบูลีน (สตริง a, สตริง b) รับสองสตริงและคืนค่า True หากเป็น palindrome มิฉะนั้นจะเป็นเท็จ

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(string a, int low, int high) {
   while (low < high) {
      if (a[low] != a[high])
         return false;
      low++;
      high--;
   }
   return true;
}
bool Split(string a, string b) {
   int low = 0;
   int high = b.size() - 1;
   while (low < high and a[low] == b[high]) {
      low++;
      high--;
   }
   return isPalindrome(a, low, high) || isPalindrome(b, low, high);
}
bool checkPalindromic(string a, string b) {
   if (a.size() < 2)
      return true;
   return Split(a, b) || Split(b, a);
}
int main() {
   string a = "abcpqr";
   string b = "mnocba";
   if (checkPalindromic(a, b)) {
      cout << "True" << endl;
   } else {
      cout << "False" << endl;
   }
   return 0;
}

การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น

ผลลัพธ์

True

คำอธิบาย: หากเราแยกสตริงที่กำหนด 'abcpqr' ​​และ 'mnocba' ที่ดัชนี '2' เช่นนั้น

a(prefix) =abc และ b(ต่อท้าย) =cba

a(suffix) =pqr และ b(prefix) =mno

เราสามารถสังเกตได้ว่า a(prefix) + b(suffix) สร้าง palindrome ดังนั้นผลลัพธ์จึงเป็น True