[编程题]压缩算法
题目:
小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为【m|S】(m为一个整数且1<=m<=100),例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?
思路:从左往右开始,找到第一个完整的"[m|S]",然后解压缩其对应的内容,重新组合结果,得到第一次解压缩后得到的字符串result,然后使用递归,把result作为形参传入compress(String str),再次解压缩。(结合程序来看更好理解)
public String compress (String str) {
// write code here
int x = -1;//第一个"]"对应的"["的索引
int y = -1;//"|"的索引
int z = -1;//第一个"]"的索引
int index = 0;
String result = str;
while (index <str.length()){
if(str.charAt(index) == '['){
x = index;
}else if(str.charAt(index) == '|'){
y = index;
}else if(str.charAt(index) == ']'){
z = index;//如果找到']',说明已经找到了第一个[m|S];此时退出循环,进行解压缩
break;
}
index++;
}
if(x != -1){//x不等于-1说明存在待解压的字符串。
String temp = str.substring(y+1,z);
int count = Integer.parseInt(str.substring(x+1,y));
String resultTemp = String.join("",Collections.nCopies(count,temp));
result = str.substring(0,x) + resultTemp + str.substring(z+1);
result = compress(result);//递归解压缩。
}
return result;
}