zoukankan      html  css  js  c++  java
  • 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算法是根据 他们分析才写出来的 ,做算法题,个人感觉最重要的是每次做了题收获是什么,这题的难点就是【】的嵌套,最初的想法是先用stack来做,可以解决单层嵌套,

    后来看他们都在用LinkedList 双向链表,来解决可能更简洁一些,相信我题刷的多了也能有自己的更好的思路吧··加油!!    2020-05-29   18:22:31 

     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 }

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

  • 相关阅读:
    javascript类型系统——日期Date对象
    javascript类型系统——undefined和null
    javascript运算符语法概述
    javascript运算符
    javascript语句——表达式语句、块语句、空语句和声明语句
    javascript语句
    javascript中的数据类型转换
    javascript类型系统
    Sqli-labs Less-21 cookie注入 base64编码 updatexml()报错注入
    Sqli-labs Less-20 cookie注入 extractvalue()报错注入
  • 原文地址:https://www.cnblogs.com/ScarecrowAnBird/p/12988471.html
Copyright © 2011-2022 走看看