เราได้รับสตริงที่มีวงเล็บและภารกิจคือการคำนวณจำนวนคู่ของลำดับวงเล็บที่สามารถเกิดขึ้นได้เพื่อให้วงเล็บมีความสมดุล
วงเล็บมีความสมดุลเมื่อมีวงเล็บเปิดและปิดเท่ากัน วงเล็บที่ใช้ครั้งเดียวไม่สามารถถือเป็นคู่สำหรับการจัดคู่ได้
ป้อนข้อมูล − string paran[] ={ ")()())", "(", ")(", ")(", ")" }
ผลผลิต − จำนวนคู่ของลำดับวงเล็บที่วงเล็บมีความสมดุลคือ 1
คำอธิบาย − เราจะนำสตริงทุกชุดมาคำนวณการนับให้ดียิ่งขึ้น ให้นำองค์ประกอบแรกเป็น “)()())” ซึ่งมี 4 วงเล็บปิดและ 2 วงเล็บเปิด ดังนั้นเราจะมองหาองค์ประกอบถัดไปในสตริงที่มีวงเล็บปิด 2 อันเพื่อสร้างลำดับวงเล็บที่สมดุลซึ่งไม่ใช่ มีอยู่ในสตริงดังนั้นเราจะทิ้งมันและไปต่อไป ดังนั้นคู่ที่ถูกต้องซึ่งมีวงเล็บเปิดและปิดเท่ากันอยู่ที่ (2, 5) ดังนั้นการนับคือ 1
ป้อนข้อมูล − string paran[] ={ ")()())", "((", "(", ")(", ")(", ")"}
ผลผลิต − จำนวนคู่ของลำดับวงเล็บที่วงเล็บมีความสมดุลคือ 1
คำอธิบาย − คู่วงเล็บสมดุลที่ถูกต้องอยู่ที่ (1, 2) และ (3, 6) ดังนั้นการนับคือ 2
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
ป้อนสตริงและคำนวณความยาวของสตริงโดยใช้ฟังก์ชัน length() และส่งข้อมูลไปยังฟังก์ชันเพื่อการประมวลผลต่อไป
-
นับตัวแปรชั่วคราวเพื่อเก็บวงเล็บคู่ที่ถูกต้อง และสร้างตัวแปร um_1 และ um_2 ประเภท unordered_map
-
เริ่มการวนซ้ำ FOR จาก 0 จนถึงขนาดของสตริง
-
ภายในลูป ให้ตั้งค่า str เป็น paran[i] เช่น องค์ประกอบแรกของวงเล็บ และคำนวณความยาวของสตริงอีกครั้ง
-
ใช้ตัวแปรชั่วคราวเป็นค่าแรกและค่าสุดท้ายและกำหนดค่าเริ่มต้นด้วย 0
-
เริ่มลูปอื่น FOR จาก j ถึง 0 จนถึงความยาวของสตริง
-
ภายในลูป ให้ตรวจสอบ IF str[j] ='(' จากนั้นให้เพิ่มค่าแรกขึ้น 1 ค่า ELSE ตรวจสอบ IF ก่อน =1 จากนั้นให้ลดค่าค่าแรกลง 1 ค่า ELSE เพิ่มค่าสุดท้ายทีละ 1
-
ตอนนี้ให้ตรวจสอบว่า IF อันดับแรกคือ 1 และสุดท้ายคือ 0 จากนั้นตั้งค่า um_1[ก่อน]++ และตรวจสอบว่า IF สุดท้ายคือ 1 และอันดับแรกคือ 0 จากนั้นตั้งค่า um_2[lst]++ และ IF ก่อนเป็น 0 และสุดท้ายเป็น 0 ด้วย จากนั้นให้เพิ่มจำนวน โดย 1.
-
ตั้งนับเป็นจำนวน / 2
-
เริ่มวนซ้ำจาก 0 ถึง um_1 และตั้งค่าให้เป็นค่าต่ำสุดจาก um_1.second และ um_2.first
-
คืนจำนวน
-
พิมพ์ผลลัพธ์
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int parentheses(string paran[], int size){ int count = 0; unordered_map<int, int> um_1, um_2; for (int i = 0; i < size; i++){ string str = paran[i]; int len = str.length(); int first = 0; int last = 0; for (int j = 0; j < len; j++){ if (str[j] == '('){ first++; } else{ if (first==1){ first--; } else{ last++; } } } if(first==1 && last!=1){ um_1[first]++; } if (last==1 && first!=1){ um_2[last]++; } if(first!=1 && last!=1){ count++; } } count = count / 2; for (auto it : um_1){ count += min(it.second, um_2[it.first]); } return count; } int main(){ string paran[] = { ")()())", "(", ")(", ")(", ")"}; int size = sizeof(paran) / sizeof(paran[0]); cout<<"Count of pairs of parentheses sequences such that parentheses are balanced are: "<<parentheses(paran, size); }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count of pairs of parentheses sequences such that parentheses are balanced are: 1