每日一题,防止痴呆 = =
一、题目大意
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
二、题目思路以及AC代码
这是今天的第二道,前一道算法多一点,这一道实现多一点,刚刚好 ^_^!
思路一:递归
由于题目给的测试样例,会出现括号包括号的情况,很容易就可以想到递归。即我们写一个函数decode(s, start, end),用于求解字符串s中从start开始的字符串到 ] 截止,end用于返回截止地方的索引。那么在函数里,我们只需要首先解析连续的数串,即为题目中的k,然后按顺序解析后面的子串,到 ] 结束,如果遇到字母,则将字母加入字符串tmp,如果遇到数字,则递归调用decode函数,将返回的字符串加入tmp,最后返回k倍长度的tmp即可。
在求解问题的时候,只要遍历字符串,当遇到数字就调用decode函数即可。
思路二:栈
其实就类似于解析算数表达式,上面能用递归,自然也可以用栈来实现,这里就不多赘述思路了。
AC代码
下面给出递归的AC代码:
bool is_num(char a) {
if (a >= '0' && a <= '9') return true;
else return false;
}
string decode(string s, int start, int& end) {
int len = s.length();
int idx = start;
int k = s[idx++] - '0';
while (is_num(s[idx])) {
k = (k*10 + s[idx++] - '0');
}
// [
idx++;
string tmp = "";
while (s[idx] != ']') {
if (is_num(s[idx])) tmp += decode(s, idx, idx);
else tmp += s[idx];
idx++;
}
end = idx;
string res = "";
for (int i=0;i<k;i++)
res += tmp;
return res;
}
class Solution {
public:
string decodeString(string s) {
int len = s.length();
int idx = 0;
string res = "";
while (idx < len) {
if (is_num(s[idx]))
res += decode(s, idx, idx);
else res += s[idx];
idx++;
}
return res;
}
};
如果有问题,欢迎大家指正!!!