تسلسل القوس الصحيح (PRS)


تتكون تسلسلات الأقواس العادية من أقواس فتح وإغلاق من نوع واحد أو أكثر ، مع وجود قوس إغلاق لكل قوس فتح ، و (في حالة الأنواع المتعددة) لا تتداخل أنواعها. & nbsp؛
تصحيح SP: & nbsp؛
(()) () () & nbsp؛
{} [()] () & nbsp؛
{[({})]} على & nbsp؛
SP غير صالح: & nbsp؛
)) (()) ((& nbsp؛
{[(])} على & nbsp؛
((]} على & nbsp؛
& nbsp؛
للتحقق مما إذا كان تسلسل الأقواس من نفس النوع ، فقط تحقق من التوازن. & nbsp؛
أي أننا نبدأ متغيرًا يساوي صفرًا (الرصيد). ثم نمرر عبر السلسلة (إذا كنت لا تعرف كيفية القيام بذلك - RUN ، STUPID!) ، ونزيد من التوازن عندما يقابل قوس الفتح وننقصه عندما يقابل الإغلاق. إذا أصبح الرصيد في أي مرحلة سالبًا أو في النهاية لا يساوي الصفر ، فإن التسلسل يكون خاطئًا. & nbsp؛

في حالة وجود عدة أنواع من الأقواس ، يصبح كل شيء أكثر تعقيدًا. نقوم بإنشاء مكدس ليكون بمثابة متغير التوازن هذا. هذا ضروري لأن الأقواس لا يمكن أن تتداخل. عندما نسير عبر خط ونواجه قوسًا مفتوحًا ، ندفعه إلى المكدس. عندما نواجه قوس إغلاق ، نحاول أن نخرج الدعامة الافتتاحية من هذا النوع من المكدس. إذا كان هناك قوس من نوع مختلف على المكدس ، فإن التسلسل غير صالح. إذا كان المكدس غير فارغ في النهاية ، فإن التسلسل غير صالح أيضًا. & nbsp؛

يتم إنشاء تسلسلات الأقواس الصحيحة مباشرة من الطريقة التي يتم بها الفحص - نحتاج فقط إلى إضافة أقواس جديدة دون الإخلال بالصحة. يتم ذلك عن طريق التكرار العودي. إذا كنت لا تعرفه - كن ... آه ، لا ، يمكنك محاولة الفهم من خلال قراءة المزيد. إليك نموذج رمز لنوع واحد من الأقواس:
نبسب ؛
 # include & lt؛ vector & gt؛ 
 # include & lt؛ iostream & gt؛ 

 باستخدام   مساحة الاسم  std؛
 int  // نصف الطول 
متجه & lt؛  char  & gt؛ الجواب.  // إجابتنا 

 باطل  rec ( int  الرصيد) {
 إذا  (ans.size () == 2 * n) { // إذا كان الأمر كذلك ، فنحن تم 
 لـ  ( int  i = 0؛ i & lt؛ 2 * n؛ i ++)
كوت & lt؛ & lt؛ الجواب [i] & lt؛ & lt؛  & quot؛ & quot؛ ؛
كوت & lt؛ & lt؛  & quot؛ \ n & quot؛ ؛
}
 إذا  (ans.size () + الرصيد + 2 & lt؛ = n * 2) { // تحقق ، نحن سوف نجعلها تغلق قوس الافتتاح الجديد 
 // الآن راقب يديك: لسنا بحاجة إلى إنشاء متجه منفصل لكل تسلسل 
ans.push_back ( & # 39؛ (& # 39 ؛ )؛
rec (الرصيد + 1) ؛
ans.pop_back () ،  // لفهم هذا ، يجب أن تكون على دراية بالتكرار. أولاً ، نضيف قوسًا إلى المتجه ، ثم ننفذ كل هذه الشفرة مرة أخرى. 
 // أي ، أضف قوسًا مرة أخرى ، إذا استطعنا. 
 // وسيحدث هذا حتى نبدأ في ترك العودية - أي حتى نصل إلى الطول المطلوب. 
 // ثم ستبدأ إزالة الأقواس. إذا فهمت هذا - أهنئك ، فأنت رائع. 
}
 إذا  (الرصيد & gt؛ 0) { // إذا كان بإمكاننا إغلاق قوس ، فإننا نغلقه. 
ans.push_back ( & # 39؛) & # 39 ؛ )؛
rec (الرصيد - 1) ؛
ans.pop_back () ،
}
}

  int  main ()
{
سينما & GT ؛ & GT. ن؛
rec (0) ؛

     إرجاع  0؛
}
والآن وقت الصعوبات - سيتعين عليك كتابة الخوارزمية لعدة أنواع من الأقواس بنفسك! مهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاها!