问题描述
给定一个编码的字符串,格式为 k[encoded_string]
,表示方括号内字符串重复 k
次。字符串可能存在嵌套编码,即 3[ab2[c]]
,表示字符串 abccabccabcc
。要求将编码的字符串进行解码还原。题目链接:**点我**
样例输入输出
输入:3[a]2[bc]
输出:aaabcbc
输入:3[a2[c]]
输出:accaccacc
问题解法
由于是用中括号来表示重复的字符串,且可能存在嵌套循环。考虑到括号匹配是用栈来判断的,所以此处仍然用栈来求解。为了便于表示并还原字符串,栈中存储的是左括号的下标,当遇到右括号的下标时,取出栈中元素可以匹配一个完整的循环字符串,而左括号之前去除数字部分即本轮还原后字符串前缀,右括号后面字符串即本轮还原后字符串后缀。这三者相加即本轮还原的字符串。字符串遍历结束即代表还原完成。代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| class Solution { public String decodeString(String s) { String result = s; Stack<Integer> stack = new Stack<>(); int i = 0; while (i < result.length()) { char ch = result.charAt(i); if (ch == '[') { stack.push(i); } else if (ch == ']') { int leftIndex = stack.pop(); String loopTimeStr = getLoopTimeStr(result, leftIndex - 1); String prefix = result.substring(0, leftIndex - loopTimeStr.length()); String suffix = result.substring(i + 1); String loopStr = result.substring(leftIndex + 1, i); result = prefix + copyString(loopStr, Integer.parseInt(loopTimeStr)) + suffix;
i = result.length() - suffix.length() - 1; }
i++; }
return result; }
private String copyString(String str, int count) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < count; i++) { sb.append(str); }
return sb.toString(); }
private String getLoopTimeStr(String str, int endIndex) { StringBuilder sb = new StringBuilder(); for (int i = endIndex; i >= 0; i--) { char ch = str.charAt(i); if (ch >= '0' && ch <= '9') { sb.append(str.charAt(i)); } else { break; } }
return sb.reverse().toString(); } }
|