สมมติว่าเรามีวงเล็บสมดุล S เราต้องคำนวณคะแนนของสตริงตามกฎต่อไปนี้ -
- The () มีคะแนน 1
- AB มีคะแนน A + B โดยที่ A และ B เป็นสตริงที่สมดุลสองสตริง
- (A) มีคะแนน 2 * A โดยที่ A คือวงเล็บสมดุล
ดังนั้นหากอินพุตเป็นเหมือน “(()(()))” ผลลัพธ์จะเป็น 6
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ans :=0 กำหนดสแต็ก st
- สำหรับ i ในช่วง 0 ถึงขนาดของสตริง S
- ถ้า S[i] เปิดวงเล็บ ให้ใส่ -1 ลงใน stack
- อย่างอื่น
- หากด้านบนของสแต็กเป็น -1 ให้ลบออกจากสแต็กแล้วแทรก 1 ลงในสแต็ก
- อย่างอื่น
- x :=0
- ในขณะที่ด้านบนของ stack ไม่ใช่ -1
- เพิ่ม x โดย st ลบจาก st
- x :=x * 2
- ลบออกจาก st แล้วใส่ x
- ในขณะที่สแต็กไม่ว่างเปล่า
- เพิ่ม ans โดยด้านบนของ st และลบองค์ประกอบด้านบน
- ส่งคืน ans.
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int scoreOfParentheses(string S) { int ans = 0; stack <int> st; for(int i = 0; i < S.size(); i+=1){ if(S[i] == '('){ st.push(-1); }else{ if(st.top() == -1){ st.pop(); st.push(1); }else{ int x = 0; while(st.top() != -1){ x += st.top(); st.pop(); } x *= 2; st.pop(); st.push(x); } } } while(!st.empty()){ ans += st.top(); st.pop(); } return ans; } }; main(){ Solution ob; cout << (ob.scoreOfParentheses("(()(()))")); }
อินพุต
"(()(()))"
ผลลัพธ์
6