码迷,mamicode.com
首页 > 编程语言 > 详细

leecode 394. 字符串解码 java版本

时间:2020-05-29 17:31:18      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:pre   返回   sem   线性   gui   空格   info   操作   ble   

leecode 394. 字符串解码   java版本

2020-05-29 17:07:06

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

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

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

示例:

s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

作者:jyd
链接:https://leetcode-cn.com/problems/decode-string/solution/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/
来源:力扣(LeetCode)

解法一:辅助栈法
本题难点在于括号内嵌套括号,需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。

算法流程:

构建辅助栈 stack, 遍历字符串 s 中每个字符 c;


1.当 c 为数字时,将数字字符转化为数字 cnt,用于后续倍数计算;
2.当 c 为字母时,在 str 尾部添加 c;
3.当 c 为 [ 时,将当前 cnt str 入栈,并分别置空置 :
  记录此 [ 前的临时结果 str 至栈,用于发现对应 ] 后的拼接操作;
  记录此 [ 前的倍数 cnt 至栈,用于发现对应 ] 后,获取 cnt × [...] 字符串。
  进入到新 [ 后,str cnt 重新记录。
4.当 c 为 ] 时,stack 出栈,拼接字符串 str= last_res + cur_multi * res,其中:
  last_res是上个 [ 到当前 [ 的字符串,例如 "3[a2[c]]" 中的 a;
  cur_multi是当前 [ 到 ] 内字符串的重复倍数,例如 "3[a2[c]]" 中的 2。
返回字符串 str
复杂度分析:

时间复杂度 O(N)O(N),一次遍历 s;
空间复杂度 O(N)O(N),辅助栈在极端情况下需要线性空间,例如 2[2[2[a]]]。

java算法是根据 他们分析才写出来的

 1 import java.util.*;
 2 class Solution {
 3     public String decodeString(String s) {
 4         LinkedList<Integer> stacki = new LinkedList<>();// 
 5         LinkedList<String> stacks = new LinkedList<>();//存放【之前的字符串
 6         StringBuilder str = new StringBuilder();   
 7         int cnt =0;
 8         for(Character c : s.toCharArray()){
 9             if(c<=‘z‘&&c>=‘a‘||c<=‘Z‘&&c>=‘A‘){
10                 str.append(c+"");
11             }
12             if(c<=‘9‘&&c>=‘0‘){
13                 cnt = cnt*10 + c-‘0‘;
14             }
15             if(c==‘[‘){
16                 stacks.addLast(str.toString());//把str存入栈
17                 stacki.addLast(cnt);//把cnt存入栈
18                 str=new StringBuilder();
19                 cnt=0;
20             }
21             if(c==‘]‘){
22                 int n = stacki.removeLast();
23                 StringBuilder st = new StringBuilder();
24                 for(int j=0;j<n;j++) st.append(str);
25                 str= new StringBuilder(stacks.removeLast() + st) ;// 3[a2[c]] 的a + cc
26             }
27         }
28         return str.toString();
29     }
30 }

 

这是之前写的代码,边界条件太多,思路混淆,不知怎么下手

 

 1 import java.util.*;
 2 class Solution {
 3     public String decodeString(String s) {
 4         Stack stack=new Stack();
 5         if(s.length()<1) return "";
 6         char[] c = s.toCharArray();
 7         String res = "";
 8         String rest = "";
 9         for(int i=0;i<c.length;i++){
10             if(c[i]==‘[‘){
11                 res = res+rest;
12                 rest="";
13             }
14             if(c[i]!=‘]‘){
15                 if(c[i]<‘z‘&&c[i]>‘a‘||c[i]<‘Z‘&&c[i]>‘A‘&&rest.length()>1){
16                     for(Character ch : rest.toCharArray()){
17                         stack.push(ch);
18                     }
19                     rest="";}
20                 stack.push(c[i]);
21             }
22             if(c[i]==‘]‘){
23                 while((char)stack.peek()!=‘[‘){
24                     rest= stack.pop()+rest;
25                 }
26                 stack.pop();
27                 int cnt = Integer.parseInt(stack.pop().toString());
28                 int j=1;
29                 while(!stack.isEmpty()&&(char)stack.peek()>=‘0‘
30                 &&(char)stack.peek()<=‘9‘){
31                     j *=10;
32                     cnt = cnt+Integer.parseInt(stack.pop().toString())*j;
33                 }
34                 String str = rest;
35                 while(cnt>1){
36                     rest = str + rest;
37                     cnt--;
38                 }
39             }
40         }
41         if(rest.length()>1)res = res+rest;
42         String t ="";
43         while(!stack.isEmpty()){
44             t = stack.pop()+t;
45         }
46             res = res + t;
47         return res;
48     }
49 }

技术图片

 

 

 心痛···,代码写的很糟糕。

 

leecode 394. 字符串解码 java版本

标签:pre   返回   sem   线性   gui   空格   info   操作   ble   

原文地址:https://www.cnblogs.com/ScarecrowAnBird/p/12988471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!