LeetCode 394

匿名 (未验证) 提交于 2019-12-03 00:19:01

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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!