题目与解释

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

示例:

  1. s = "3[a![](https://img2018.cnblogs.com/blog/1575923/201903/1575923-20190304151000879-833294601.png)
  2. ]2[bc]", 返回 "aaabcbc".
  3. s = "3[a2[c]]", 返回 "accaccacc".
  4. s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

解释:

这道实际上是一道字符串与栈结合的问题。如何看出是栈结合的问题呢?

  1. 有匹配('['和']')的情况,需要使用栈来完成匹配过程
  2. 有递归的情况, 如3[2[ab]]这样

在匹配符号上,我参照我之前写的小型计算器的符号匹配,遇到']'就去寻找最近出现的匹配符号'['。

思路

建立一个字符栈,这里用的是STL自带的stack<char>

逐个读入字符压入栈,当遇到']'符号就寻找最近的匹配符号。

这个寻找的过程就是不断判断栈顶是否为'['符号?

->否。这个是括号内的字符,暂时存入一个字符串ss

->是。则寻找到匹配的字符,继续往前寻找'['的字符前的所有"数字字符串",如34[22[ss]],那么22就是[ss]的数字字符串,34则是[22[ss]]的数字字符串。在寻找完后需要将这个字符串转换成实际的数字。

经过一次上述过程后,已经知道一个括号内字符串和这段字符串出现的次数k。我们把k个字符串压入我们创建的字符栈。

而当所有字符都读完了,则转换实际上就已经结束了。我们先根据思路写一段解法,但效率还不是很高。

我们看看"3[a1[b]]"的图例

  1. class Solution {
  2. public:
  3. string decodeString(string s) {
  4. string ans = "";
  5. stack<char>st;
  6. /*visit all the character in the string s*/
  7. for (unsigned i = 0; i < s.length(); i++) {
  8. if (s[i] != ']')st.push(s[i]);
  9. else {
  10. /*
  11. if we find the character ']', it means we find a pair.
  12. string ss means the string in the pair of this times.
  13. string num means the number k in the pair of this times.
  14. Initialize these two strings as an empty string.
  15. */
  16. string ss = "", num = "";
  17. while (st.top() != '[') {
  18. ss += st.top();
  19. st.pop();
  20. }
  21. /*Delete '[' character*/
  22. st.pop();
  23. /*reverse the string ss*/
  24. reverse(ss.begin(), ss.end());
  25. while (!st.empty() && st.top() <= '9'&&st.top() >= '0') {
  26. num += st.top();
  27. st.pop();
  28. }
  29. unsigned times = 0, index = 1;
  30. for (unsigned i = 0; i < num.length(); i++, index =index* 10) {
  31. times += index * (num[i]-'0');
  32. }
  33. string sss ="";
  34. for (unsigned i = 0; i < times; i++) {
  35. sss += ss;
  36. }
  37. for (unsigned i = 0; i < sss.length(); i++) {
  38. st.push(sss[i]);
  39. }
  40. }
  41. }
  42. /* push the k times string to the stack st*/
  43. while (!st.empty()) {
  44. ans += st.top();
  45. st.pop();
  46. }
  47. reverse(ans.begin(), ans.end());
  48. return ans;
  49. }
  50. };

很暴力的按照思路的过程写了代码,优化点是可以自己写一个stack而不是使用STL的stack,使这个自己写的stack拥有遍历的方法。新增的内容有注释提示。能将上面代码优化4ms。

  1. /*********added below*********/
  2. class Stack {
  3. public:
  4. Stack() {
  5. topNum = -1;
  6. ll.clear();
  7. }
  8. void push(char c) {
  9. ll.push_back(c);
  10. topNum++;
  11. }
  12. char top() {
  13. return ll[topNum];
  14. }
  15. void pop() {
  16. ll.pop_back();
  17. topNum--;
  18. }
  19. bool empty() {
  20. return topNum == -1;
  21. }
  22. vector<char>ll;
  23. private:
  24. int topNum;
  25. };
  26. /******add above*********/
  27. class Solution {
  28. public:
  29. string decodeString(string s) {
  30. string ans = "";
  31. Stack* st=new Stack();
  32. for (unsigned i = 0; i < s.length(); i++) {
  33. if (s[i] != ']')st->push(s[i]);
  34. else {
  35. string ss = "", num = "";
  36. while (st->top() != '[') {
  37. ss += st->top();
  38. st->pop();
  39. }
  40. st->pop();
  41. /*Delete '[' character*/
  42. reverse(ss.begin(), ss.end());
  43. while (!st->empty() && st->top() <= '9'&&st->top() >= '0') {
  44. num += st->top();
  45. st->pop();
  46. }
  47. unsigned times = 0, index = 1;
  48. for (unsigned i = 0; i < num.length(); i++, index =index* 10) {
  49. times += index * (num[i]-'0');
  50. }
  51. string sss ="";
  52. for (unsigned i = 0; i < times; i++) {
  53. sss += ss;
  54. }
  55. for (unsigned i = 0; i < sss.length(); i++) {
  56. st->push(sss[i]);
  57. }
  58. }
  59. }
  60. /******change below********/
  61. for (char it : st->ll) {
  62. ans += it;
  63. }
  64. /******change above********/
  65. delete st;
  66. return ans;
  67. }
  68. };

[Leetcode]394.字符串解码的更多相关文章

  1. LeetCode 394. 字符串解码(Decode String) 44

    394. 字符串解码 394. Decode String 题目描述 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 enco ...

  2. Java实现 LeetCode 394 字符串解码

    394. 字符串解码 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k ...

  3. [LeetCode]394. 字符串解码(栈)

    题目 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数. ...

  4. Leetcode 394.字符串编码

    字符串编码 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正 ...

  5. [LeetCode] 394. Decode String 解码字符串

    Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...

  6. [LeetCode] Decode String 解码字符串

    Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...

  7. 字符串解码DecodeString

    字符串解码 原创博客,转载请注明出处!eg:ss=2[abc]3[cd]ef   return:abcabccdcdcdefss=3[a2[c]]2[a]    return:accaccaccaas ...

  8. [PHP]对Json字符串解码返回NULL的一般解决方案

    ---------------------------------------------------------------------------------------------------- ...

  9. Leetcode中字符串总结

    本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗 ...

随机推荐

  1. LINQ之let关键字

    let子句用于在LINQ表达式中存储子表达式的计算结果.let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. 实例1 ...

  2. 动态创建js脚本和 css样式

    //1.动态添加外部js文件 function loadScript(url){ var script = document.createElement("script"); sc ...

  3. [leetcode]42. Trapping Rain Water雨水积水问题

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  4. ASP.NET CORE 2.0 发布到IIS,IIS如何设置环境变量来区分生产环境和测试环境

    0.前言 因为给前端的测试环境是windows,所以要设置windows上的环境变量,如果上Linux就没有这篇文章了,所以大家不要在意为什么core不放在linux上. 1.网上的解决方案 a 方式 ...

  5. 六、maven仓库中安装没有的jar包

    举例:安装dubbo.jar Dubbox 的 jar 包并没有部署到 Maven 的中央仓库中,大家在 Maven 的中央仓库中可以查找到 Dubbo 的最终版本是 2.5.3 , 阿里巴巴解散了 ...

  6. Idea+maven+testNG+Selenium+ReportNG自动化框架搭建

    1.Idea创建一个空的Maven项目 创建后默认项目目录如图所示 2.配置pom.xml文件 <?xml version="1.0" encoding="UTF- ...

  7. 通过github安装crawley出现的问题

    http://www.cnblogs.com/hbwxcw/p/7086188.html

  8. python环境问题(pycharm)

    一.问题 我们在使用python的时候会遇到环境配置问题.如何可以一劳永逸,是我们解决问题的基本思想. 二.解决1.新建环境: 2.添加环境:选择需要的环境,可以是conda,亦可以是virtual. ...

  9. 从服务器角度分析RPG游戏——NPC的AI

    最近主程有些忙,甩给我一些服务器的代码,零零散散总结了一些要素. java程序架构也是层层分析,先罗列出需要做的工作,然后从主干到细节依次实现.就这点而言,程序和绘画有很多类似的地方. 关于怪物AI类 ...

  10. Linux安装yum

    方法/步骤 1 查看.卸载已安装的yum包 查看已安装的yum包 #rpm –qa|grep yum 卸载软件包 #rpm –e –nodeps yum 2 下载安装依赖包python python- ...