题目描述
给定一个字符串编码,请返回解码后的结果。
编码规则是:k[encoded_string]
,表示将中括号中的字符串重复 $k$ 次,其中 $k$ 保证是正整数。
你可以假设输入的字符串编码一定是合法的:没有多余空格,中括号一定是匹配的等等。
进一步,你可以假设原字符串中不包含任何数字,字符串编码中的数字只用来表示重复次数。例如,输入的字符串不会是3a
和2[4]
。
样例
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
算法
(递归) $O(k^n)$
此题利用递归的思想来做。
从左到右扫描整个字符串:
- 如果遇到字母,则直接添加在答案中;
- 如果遇到
k[encoded_string]
的规则,则解析出数字k
和字符串encoded_string
,然后递归解码encoded_string
,并将解码得到的结果在答案中添加k
次;
时间复杂度分析:假设共有 $n$ 个规则,则最坏情况下所有规则会嵌套 $n$ 层:k[k[...k[encoded_string]]]
。则最终解码后的字符串长度是 encoded_string.length * k^n
。所以时间复杂度是 $O(k^n)$。
C++ 代码
class Solution {
public:
string decodeString(string s) {
string res;
for (int i = 0; i < s.size();)
{
if (!isdigit(s[i])) res += s[i ++ ];
else
{
int j = i;
while (isdigit(s[j])) j ++ ;
int t = atoi(s.substr(i, j - i).c_str());
int k = j + 1, sum = 0;
while (sum >= 0)
{
if (s[k] == '[') sum ++ ;
if (s[k] == ']') sum -- ;
k ++ ;
}
string str = decodeString(s.substr(j + 1, k - j - 2));
while (t -- ) res += str;
i = k;
}
}
return res;
}
};
https://www.youtube.com/watch?v=JXlosO-4BSI
谢谢老师的回答,老师的答案很棒!这个答案的思路我是明白的,提交速度也是百分之百。但是我想问的是这个答案哪里体现出dfs的思想呢,或者说,怎么画出来相应的dfs 的逻辑树呢,谢谢
这题是按照深度优先的方式进行遍历,每次遇到一个k规则就会向下递归一层,每做完一个k规则就会回溯一层,k规则的嵌套次数对应了递归的深度,整个遍历顺序对应了一棵深度优先搜索树。