Leetcode 394. 字符串解码
地址 https://leetcode-cn.com/problems/decode-string/
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]"
输出:"accaccacc"
示例 3:
输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"
示例 4:
输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"
提示:
1 <= s.length <= 30
s 由小写英文字母、数字和方括号 '[]' 组成
s 保证是一个 有效 的输入。
s 中所有整数的取值范围为 [1, 300]
解答
整个字符串解码可以分为三种情况:
1 开头为数字的,解析出数字,然后后面跟随的是由[]包含的另一端需要解码的字符串。递归调用解码函数,但是字符串肯定是缩短了(这样才可能逐步减少为长度0,作为递归退出的时机)。
2 以[开头的 ,使用[]包含的一串需要解码的字符串
3 纯字母开头的一串直接加入答案得到字母字符串。
class Solution {
public:
int findNextspChar(const string& s, int l) {
int leftCnt = 0;
while (l <= s.size()) {
if (s[l] == '[') { leftCnt++; }
if (s[l] == ']') { leftCnt--; }
if (leftCnt == 0) break;
l++;
}
return l;
}
int fineNextNoNum(const string& s, int l) {
while (l < s.size()) {
if (s[l] < '0' || s[l] > '9') { break; }
l++;
}
return l;
}
int findNextNoChar(const string& s, int l) {
while (l < s.size()) {
if (s[l] < 'a' || s[l] > 'z') { break; }
l++;
}
return l;
}
string decodeStringInner(const string& s, int l, int r) {
if (l > r) return ""; string ret;
int repeat = 0;
while (l <= r) {
if (s[l] == '[') {
int rr = findNextspChar(s, l);
string tmp = decodeStringInner(s, l + 1, rr - 1);
for (int i = 0; i < repeat; i++) {
ret += tmp;
}
repeat = 0; l = rr + 1;
}
else if (s[l] >= '0' && s[l] <= '9') {
int rr = fineNextNoNum(s, l);
repeat = atoi(s.substr(l, r - l).c_str());
l = rr;
}
else if (s[l] >= 'a' && s[l] <= 'z') {
int rr = findNextNoChar(s, l);
ret += s.substr(l, rr - l);
l = rr;
}
}
return ret;
}
string decodeString(string s) {
int l = 0; int r = s.size()-1;
return decodeStringInner(s, l, r);
}
};
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力