สมมติว่าเราได้รับสตริง "abc" ที่ถูกต้อง ดังนั้นจากสตริง V ที่ถูกต้องใดๆ เราสามารถแบ่ง V ออกเป็นสองส่วน X และ Y โดยที่ X + Y จะเหมือนกับ V (X หรือ Y อาจว่างเปล่า) จากนั้น X + "abc" + Y ก็ใช้ได้เช่นกัน ตัวอย่างเช่น S ="abc" ตัวอย่างของสตริงที่ถูกต้อง ได้แก่ "abc", "aabcbc", "abcabc", "abcabcababcc" และตัวอย่างของสตริงที่ไม่ถูกต้อง ได้แก่ "abccba", "ab", "cababc", "bac" เราต้องตรวจสอบว่าจริงหรือไม่ก็ต่อเมื่อสตริงที่กำหนด S ถูกต้อง
ดังนั้นหากอินพุตเป็นเหมือน “abcabcababcc” แสดงว่าถูกต้อง ดังนั้นเอาต์พุตจะเป็นจริง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดสแต็ก st
-
สำหรับผมอยู่ในช่วง 0 ถึงขนาด S
-
หาก st ว่างเปล่าหรือ S[i] ไม่เหมือนกับ 'c' ให้กด S[i] ลงในสแต็ก
-
อย่างอื่น
-
ใส่ c ลงใน st
-
ในขณะที่ขนาดของ st>=3
-
c :=ด้านบนของ st และเปิดองค์ประกอบด้านบนจาก st
-
b :=ด้านบนของ st และเปิดองค์ประกอบด้านบนจาก st
-
a :=ด้านบนของ st และเปิดองค์ประกอบด้านบนจาก st
-
temp :=temp เชื่อมกับ a
-
temp :=temp เชื่อมกับ b
-
temp :=temp เชื่อมกับ c
-
ถ้า temp เป็น “abc” ให้ทำซ้ำต่อไป
-
อย่างอื่น
-
ดัน a แล้วก็ b แล้วก็ c เป็น st แล้วทำลายลูป
-
-
-
-
คืนค่า จริง เมื่อ st ว่างเปล่า มิฉะนั้น คืนค่า เท็จ
-
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: bool isValid(string S) { stack <char> st; for(int i = 0; i < S.size(); i++){ if(st.empty() || S[i] != 'c'){ st.push(S[i]); }else{ st.push('c'); while(st.size() >= 3){ char c = st.top(); st.pop(); char b = st.top(); st.pop(); char a = st.top(); st.pop(); string temp = ""; temp += a; temp += b; temp += c; if(temp == "abc"){ continue; }else{ st.push(a); st.push(b); st.push(c); break; } } } } return st.empty(); } }; main(){ Solution ob; cout << (ob.isValid("abcabcababcc")); }
อินพุต
“abcabcababcc”
ผลลัพธ์
1