mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
2.3 KiB
2.3 KiB
394. Decode String
思路
给定一个编码后的字符串,根据规则对其解码。
由题意知,由于k[encoded_string]
中的encoded_string
内部依然可能包含k[encoded_string]
这种形式,所以我们可以用递归求解。
我们用res表示当前已经解码好的字符串,用两个指针l
和r
分别代表子串的左右边界,然后用brackets_count
表示待配对的括号数,则有以下几种情况:
- 如果
s[r] >= '0' && s[r] <= '9' && brackets_count == 0
: 说明此时s.substr(l, r-l)
是一个普通的串,无需解码, 即res += s.substr(l, r-l)
即可。由于此时s[r]
是数字(即一个数的开头),所以我们还需用一个变量k记录这个数,留在下次用。 - 否则,如果
s[r] == '['
,待配对的括号数加一个,即brackets_count++
。 - 否则,如果
s[r] == ']'
,待配对的括号数减一个,即brackets_count--
。另外如果此时brackets_count
等于0了, 说明此时s.substr(l, r-l)
就是一个需要递归调用解码函数的子串,而且别忘了次数k,所以res
加k
次decodeString(s.substr(l, r-l))
即可。 - 否则,即普通字符,那么
r++
即可(注意上述三种情况最后也需要合理更新l
和r
)。
此题也可以用迭代的解法,用两个stack,一个记录次数k,一个记录待处理子串。
C++
class Solution {
public:
string decodeString(string s) {
if(s.size() == 0) return "";
string res = "";
int l = 0, r = 0;
int brackets_count = 0, k = -1;
while(r < s.size()){
if(s[r] >= '0' && s[r] <= '9' && !brackets_count){
res += s.substr(l, r-l);
l = r;
while(r < s.size() && s[r] >= '0' && s[r] <= '9') r++;
k = stoi(s.substr(l, r-l));
l = r + 1;
r -= 1; // 后面要加1所以这里先减去1
}
else if(s[r] == '[') brackets_count++;
else if(s[r] == ']'){
if(--brackets_count == 0){
while(k--)
res += decodeString(s.substr(l, r-l));
l = r + 1;
}
}
r++;
}
return res + s.substr(l, r-l);
}
};