LeetCode 394
Decode String
说明:在提交测试过程中发现很多自己没想到的情况,在原基础上进行修改,可能思路看起来不太清晰,有心情再完善吧(很大可能忘了)。不看也罢,谨以此纪念我产生的代码垃圾。
Problem Description:
对给出的一串简略字符串进行翻译还原
具体的题目信息:
https://leetcode.com/problems/decode-string/description/Examples:
(1) 3[bc2[a]d]
(2) 2[as]de
(3) dea3[sa]Solution:
根据读取到的不同字符进行相应的操作:
若读取到 “ [ ”:用flag变量记录该字符出现的次数,方便后续对单个字符(没有中括号包含起来的字符)进行操作
若读取到数字:根据此时flag大小及其他判断条件输出单个字符
若读取到字母:直接push进栈
若读取到 “ ] ”:对栈中字符进行输出处理
class Solution { public: string decodeString(string s) { string result = ""; stack<char> zifu; stack<char> rezifu; int flag = 0; for (int i = 0; i < s.length(); i++) { if (s[i] == ']') { string temp = ""; string result1 = ""; int times = 0; flag-=1; while(!zifu.empty()&&zifu.top()!='[') { rezifu.push(zifu.top()); zifu.pop(); } if (!zifu.empty()&&zifu.top() == '[') { //对子字符串出现的次数进行统计 zifu.pop(); stack<int> num; while(!zifu.empty()&&zifu.top()-'0'>= 0&&zifu.top()-'0'<= 9) { num.push(zifu.top()-'0'); zifu.pop(); } while(!num.empty()) { times = times*10+num.top(); num.pop(); } } while(!rezifu.empty()) { temp += rezifu.top(); rezifu.pop(); } while(times--) { result1 += temp; } int length = result1.length(); if(!zifu.empty()) { for(int i = 0; i < length; i++) { zifu.push(result1[i]); } } else { result += result1; } } else if (s[i]-'0'>=0&&s[i]-'0'<=9) { if (flag == 0&&!zifu.empty()&&zifu.top()>='a'&&zifu.top()<='z') { //对单个字符输出进行操作:这里只考虑到位于字符串中与字符串头的单字符 while(!zifu.empty()) { rezifu.push(zifu.top()); zifu.pop(); } } while(!rezifu.empty()) { result+=rezifu.top(); rezifu.pop(); } zifu.push(s[i]); } else if (s[i] == '['){ //flag记录出现的“[”次数 flag += 1; zifu.push(s[i]); } else { zifu.push(s[i]); } } //后续补充这两个循环是在判断输出单个字符时加上的,原先没有考虑单个字符在输入字符串末尾的情况 while(!zifu.empty()) { rezifu.push(zifu.top()); zifu.pop(); } while(!rezifu.empty()) { result+=rezifu.top(); rezifu.pop(); } return result; } };
文章来源: LeetCode 394