解压字符串

来源:互联网 发布:悠悠球雪鳞锋淘宝 编辑:程序博客网 时间:2024/06/05 06:40

题目:
某位程序员想出了一种压缩字符串的方法,压缩后的字符串如下:3{a}2{bc}, 3{a2{c}},2{abc}3{cd}ef,现在需要你写出一个解压程序,还原原始的字符串,如:
s=“3{a}2{bc}”return “aaabcbc” , s=”3{a2{c}}” return “accaccacc” ,s=”2{abc}3{cd}ef” return “abcabccdcdcdef”,重复次数可以确保为一个正整数。

解答:
递归方法:

import java.util.Scanner;public class Main {    public static String unZip(String s) {        if(s == null || s.length() ==0) {            return s;        }        StringBuilder sb = new StringBuilder();        int sum = 0;        int i = 0;        while(i<s.length()) {            if(s.charAt(i) > '0' && s.charAt(i) <= '9') {                sum = sum*10 + (s.charAt(i)-'0');                i++;            } else if(s.charAt(i)=='{') {                int j = i+1;                int times = 1;                while(j++<s.length()) {                    if(s.charAt(j)=='{') {                        times++;                    } else if(s.charAt(j)=='}') {                        times--;                        }                    if(times ==0) {                        break;                    }                }                String sub = s.substring(i+1, j);                String ss = unZip(sub);                for(int k=0; k<sum; k++) {                    sb.append(ss);                }                //下一个"{"开始                sum = 0;                i=j+1;            } else {                sb.append(s.charAt(i));                i++;            }        }        return sb.toString();       }    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        String inValue = in.nextLine();        String res = unZip(inValue);        System.out.println(res);    }   }

非递归方法:

import java.util.Scanner;import java.util.Stack;public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        String inValue = in.nextLine();        if(inValue == null || inValue.length() ==0) {            return;        }        char[] c = inValue.toCharArray();        Stack<Integer> times = new Stack<>();        Stack<String> ch = new Stack<>();        StringBuilder sb = new StringBuilder();        StringBuilder shuzi = new StringBuilder();        StringBuilder zfc = new StringBuilder();        for(int i=0; i<c.length; i++) {            int res = c[i] - 48;            if(res<1 || res>9 && res !=75 && res !=77) {                if(times.isEmpty()) {                     sb.append(c[i]);                } else {                                    zfc.append(c[i]);                }            } else if(res>=1 && res<=9){                 shuzi.append(c[i]);            } else if(res == 75) {                times.push(Integer.parseInt(shuzi.toString()));                shuzi = new StringBuilder();                if(zfc.length() !=0) {                    ch.push(zfc.toString());                    zfc = new StringBuilder();                }            } else {                                if(zfc.length() !=0) {                    ch.push(zfc.toString());                    zfc = new StringBuilder();                }                StringBuilder temp = new StringBuilder();                while(!times.isEmpty() && !ch.isEmpty()) {                    int t = times.pop();                    String s = ch.pop();                    StringBuilder temp1 = new StringBuilder();                    temp1.append(s);                    temp1.append(temp.toString());                    StringBuilder temp2 = new StringBuilder();                    for(int k=0; k<t; k++) {                        temp2.append(temp1.toString());                    }                    temp = temp2;                }                sb.append(temp);            }        }        System.out.println(sb.toString());    }}
原创粉丝点击