นิพจน์ที่สมดุลของวงเล็บคือนิพจน์ที่มีคู่ของวงเล็บทั้งหมดเข้าด้วยกันในลำดับที่ถูกต้อง ซึ่งหมายความว่าสำหรับวงเล็บเปิดทุกอัน จะมีวงเล็บปิดในวงเล็บที่เหมาะสม เช่น { }.
นิพจน์ − {([][]{})({}[]{})}
ผลผลิต − สมดุล
ในปัญหานี้ เราต้องสร้างนิพจน์ที่สมดุลที่เป็นไปได้ทั้งหมดจากจำนวนวงเล็บที่กำหนด เงื่อนไขคือตำแหน่งที่กำหนดมีวงเล็บเปิด
ในปัญหานี้ เราได้รับจำนวนเต็ม n และอาร์เรย์ของตำแหน่งของวงเล็บที่มีความยาว 2n และเราต้องค้นหาจำนวนนิพจน์ที่สมดุลของความยาว 2n ในลักษณะที่ตำแหน่งที่ทำเครื่องหมายโดยวงเล็บเปิดจะมีวงเล็บเปิด ' {'.
ตัวอย่าง −
Input : n = 2 , position [1, 0 , 0 , 0].
Output : 2
Explanation : All possible outcomes are : {{}} , {}{}. อัลกอริทึม
-
ทุกตำแหน่งที่มีหนึ่งเป็นวงเล็บเปิด
-
ใช้การวนซ้ำโดยใช้กฎต่อไปนี้
-
ถ้า ( จำนวนวงเล็บเปิด - จำนวนวงเล็บปิด )> 0 ให้คืนค่า 0
-
หลังจากวนซ้ำจนถึง n และหากวงเล็บทั้งหมดหลังจากกดและป๊อปเป็น 0 ให้คืนค่า 1 นั่นคือโซลูชันที่ได้รับ มิฉะนั้นให้คืนค่า 0
-
ถ้า 1 ถูกกำหนดล่วงหน้าให้กับนิพจน์ ให้เรียกซ้ำเพื่อเพิ่มดัชนีและเพิ่มจำนวนวงเล็บทั้งหมด
-
มิฉะนั้น ให้เรียกใช้ฟังก์ชันแบบเรียกซ้ำโดยใส่วงเล็บเปิดที่ตำแหน่งดัชนี จากนั้นใส่วงเล็บปิดสำหรับฟังก์ชันนั้น และลดจำนวนวงเล็บทั้งหมดและย้ายไปยังดัชนีถัดไป
-
โปรแกรม
#include <bits/stdc++.h>
using namespace std;
int find(int index, int openbrk, int n, int expression[]){
if (openbrk < 0)
return 0;
if (index == n){
if (openbrk == 0)
return 1;
else
return 0;
}
if (expression[index] == 1) {
return find(index + 1, openbrk + 1, n, expression);
} else {
return find(index + 1, openbrk + 1, n, expression) + find(index + 1, openbrk - 1, n, expression);
}
}
int main() {
int n = 3;
int expression[6] = { 1, 0, 1, 0, 0, 0};
cout << find(0, 0, 2 * n, expression) <<endl;
return 0;
}