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

C ++ นิพจน์ที่สมดุลเพื่อให้ตำแหน่งที่กำหนดมีวงเล็บเปิด


นิพจน์ที่สมดุลของวงเล็บคือนิพจน์ที่มีคู่ของวงเล็บทั้งหมดเข้าด้วยกันในลำดับที่ถูกต้อง ซึ่งหมายความว่าสำหรับวงเล็บเปิดทุกอัน จะมีวงเล็บปิดในวงเล็บที่เหมาะสม เช่น { }.

นิพจน์ − {([][]{})({}[]{})}

ผลผลิต − สมดุล

ในปัญหานี้ เราต้องสร้างนิพจน์ที่สมดุลที่เป็นไปได้ทั้งหมดจากจำนวนวงเล็บที่กำหนด เงื่อนไขคือตำแหน่งที่กำหนดมีวงเล็บเปิด

ในปัญหานี้ เราได้รับจำนวนเต็ม 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;
}

ผลลัพธ์

3