Given an encoded string, return it's decoded string.
The encoding rule is: k[encoded_string]
,
where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.
You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.
Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won't be input like 3a
or 2[4]
.
Examples:
s = "3[a]2[bc]", return "aaabcbc". s = "3[a2[c]]", return "accaccacc". s = "2[abc]3[cd]ef", return "abcabccdcdcdef".
我觉得这种题目都不是考逻辑思维,而是考编码能力的。。。
public String decodeString(String s) {
if(s.indexOf('[')==-1){
return s;
}
StringBuilder sb=new StringBuilder();
char[] cs=s.toCharArray();
String integs="";
int i=0;
while(i<cs.length){
if(cs[i]>='0'&&cs[i]<='9'){
integs+=cs[i];
i++;
}
else if(cs[i]=='['){
int leftBound=1;
i++;
String innerString="";
while(i<cs.length&&leftBound>0){
if(cs[i]=='['){
leftBound++;
}
else if(cs[i]==']'){
leftBound--;
}
if(leftBound>0){
innerString+=cs[i];
}
i++;
}
String repeatString=decodeString(innerString);
int repeatTimes=Integer.parseInt(integs);
for(int count=0;count<repeatTimes;count++){
sb.append(repeatString);
}
integs="";
}
else{//9[cs]ab中的ab这样的情况
sb.append(cs[i]);
i++;
}
}
return sb.toString();
}
大神没用递归,用的栈来迭代。
public class Solution {
public String decodeString(String s) {
String res = "";
Stack<Integer> countStack = new Stack<>();
Stack<String> resStack = new Stack<>();
int idx = 0;
while (idx < s.length()) {
if (Character.isDigit(s.charAt(idx))) {
int count = 0;
while (Character.isDigit(s.charAt(idx))) {
count = 10 * count + (s.charAt(idx) - '0');
idx++;
}
countStack.push(count);
}
else if (s.charAt(idx) == '[') {
resStack.push(res);
res = "";//当前的res存储当前的repeatString
idx++;
}
else if (s.charAt(idx) == ']') {
StringBuilder temp = new StringBuilder (resStack.pop());
int repeatTimes = countStack.pop();
for (int i = 0; i < repeatTimes; i++) {
temp.append(res);
}
res = temp.toString();
idx++;
}
else {
res += s.charAt(idx++);
}
}
return res;
}
}