สมมติว่าเรามีสตริงที่เข้ารหัสแล้ว เราต้องคืนค่าสตริงที่ถอดรหัสแล้ว กฎการเข้ารหัสคือ: k[encoded_string] ซึ่งบ่งชี้ว่า encoded_string ภายในวงเล็บเหลี่ยมจะถูกทำซ้ำทั้งหมด k ครั้ง เราสามารถสมมติได้ว่าข้อมูลต้นฉบับไม่มีตัวเลข และตัวเลขใช้เฉพาะสำหรับตัวเลขซ้ำ k เท่านั้น ดังนั้น หากอินพุตเป็น "1[ba]2[na]" ผลลัพธ์จะเป็น "banana"
ขั้นตอนการแก้ปัญหา
- สร้างสแต็กว่างหนึ่งอัน ตั้งค่า i := 0
- while i < ขนาดของสตริง
- ถ้า s[i] เป็น ']'
- res := ลบองค์ประกอบจากสแต็กและนำเฉพาะสตริงที่อยู่ภายในวงเล็บเหลี่ยม
- n := 0
- while สแต็กไม่ว่าง และค่าบนสุดของสแต็กเป็นตัวเลข ให้รวมตัวเลขเพื่อสร้างจำนวนเต็มจริงเป็น n
- for j ในช่วง 1 ถึง n
- for x ในช่วง 0 ถึงขนาดของ res
- แทรก res[x] ลงในสแต็ก
- for x ในช่วง 0 ถึงขนาดของ res
- อื่นๆ ให้แทรก s[i] ลงในสแต็ก
- เพิ่ม i ขึ้น 1
- ถ้า s[i] เป็น ']'
- ans := สตริงว่าง
- while สแต็กไม่ว่าง
- ans := องค์ประกอบบนสุดของสแต็ก + ans
- pop จากสแต็ก
- คืนค่า 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;
}
};
int main(){
Solution ob;
cout << ob.decodeString("1[ba]2[na]");
}อินพุต
"1[ba]2[na]"
เอาต์พุต
"banana"