解压字符串
来源:互联网 发布:悠悠球雪鳞锋淘宝 编辑:程序博客网 时间: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()); }}
阅读全文
0 0
- 解压字符串
- 解压字符串
- 解压字符串
- 字符串压缩和解压
- GZipStream压缩解压字符串
- C#字符串压缩&解压
- 简单字符串解压程序代码
- iOS GZIP 字符串解压
- 字符串的压缩和解压
- 字符串的压缩与解压
- iOS 字符串转码+解压
- C#字符串压缩和解压
- JAVA压缩和解压字符串
- 压缩与解压1---字符串的压缩与解压
- PHP 对字符串进行压缩和解压
- C# 对字符串的压缩和解压
- C# GZip对字符串压缩和解压
- C# GZip对字符串压缩和解压
- Java代码安全规范
- python如何提取tuple类型值中json格式的key值
- EasyDSS高性能流媒体服务器前端重构(三): webpack + vue + AdminLTE 多页面引入 element-ui
- 和Android的第一次美丽邂逅
- 【等考】二级C语言程序设计考试大纲(2013年版)
- 解压字符串
- CSS边框和背景
- jstl 报错检查思路
- 在position absolute div 怎么居中
- Android MVP框架代码(供大家参考)
- 常见的浏览器端的存储技术有哪些
- 跟随导航,导航定位,导航如何一直漂浮在上方
- java线程入门示例
- spoj DQUERY D-query SPOJ -(主席树)