สมมติว่าเรามีสตริงที่เข้ารหัส เราต้องส่งคืนสตริงที่ถอดรหัสแล้ว กฎสำหรับการเข้ารหัสคือ:k[encoded_string] ซึ่งบ่งชี้ตำแหน่งที่ encoded_string ในวงเล็บเหลี่ยมมีการทำซ้ำ k ครั้งพอดี เราสามารถสรุปได้ว่าข้อมูลเดิมไม่มีอักขระที่เป็นตัวเลขและตัวเลขนั้นใช้สำหรับตัวเลขที่ซ้ำกันเท่านั้น k ดังนั้นหากอินพุตเป็นเหมือน “1[ba]2[na]” เอาต์พุตจะเป็น “banana”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างสแต็คว่างหนึ่งอัน ตั้งค่า i :=0
- ในขณะที่ฉัน <ขนาดของสตริง
- ถ้า s[i] คือ ']'
- res :=ลบองค์ประกอบออกจากสแต็กและรับเฉพาะสตริงที่อยู่ภายในวงเล็บเหลี่ยม
- n :=0
- ในขณะที่สแต็กไม่ว่างเปล่า และด้านบนสแต็กเป็นอักขระตัวเลขหนึ่งตัว จากนั้นปรับตัวเลขและสร้างจำนวนเต็มจริงเป็น n
- สำหรับ j ในช่วง 1 ถึง n
- สำหรับ x ในช่วง 0 ถึงขนาดของ res
- แทรก res[x] ลงในสแต็ก
- สำหรับ x ในช่วง 0 ถึงขนาดของ res
- มิฉะนั้นให้แทรก s[i] ลงในสแต็ก
- เพิ่ม i ขึ้น 1
- ถ้า s[i] คือ ']'
- ans :=สตริงว่าง
- ในขณะที่สแต็กไม่ว่างเปล่า
- ans :=สแต็คองค์ประกอบด้านบน + ans
- ป๊อปจากสแต็ก
- คืนสินค้า
ตัวอย่าง(C++):
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string decodeString(string s) {
stack <char> st;
int i = 0;
while(i<s.size()){
if(s[i] == ']'){
string res = "";
while(st.top()!='['){
res = st.top() + res;
st.pop();
}
st.pop();
int n = 0;
int x = 1;
while(!st.empty() && st.top()>='0' && st.top()<='9'){
n = n + (st.top()-'0')*x;
x*=10;
st.pop();
}
for(int j = 1; j <= n; j++){
for(int x = 0; x < res.size();x++){
st.push(res[x]);
}
}
}
else{
st.push(s[i]);
}
i++;
}
string ans ="";
while(!st.empty()){
ans = st.top() + ans;
st.pop();
}
return ans;
}
};
main(){
Solution ob;
cout << ob.decodeString("1[ba]2[na]");
} อินพุต
"1[ba]2[na]"
ผลลัพธ์
"banana"