😊😊 😊😊
不求点赞,只求耐心看完,指出您的疑惑和写的不好的地方,谢谢您。本人会及时更正感谢。希望看完后能帮助您理解算法的本质
😊😊 😊😊
题目描述:
小白到进阶各种解法:
一、暴搜:😊
思路:递归
本题可以将一个字符串分为三种情况进行讨论:
- 当前字符为 ′ [ ′ '[' ′[′,则下一个必为数字,说明进入到了压缩的部分,需要我们解压缩,在输入数字 c n t cnt cnt之后,将解压缩的部分累计 c n t cnt cnt 次!
- 当前字符为字符: A Z 部分 A~Z部分 A Z部分,则直接统计当前字符到字符串里面。
- 若为 ′ ] ′ ']' ′]′:则此时说明解压缩完毕,将当前字符串进行返回!返回后赋值 c n t cnt cnt 次给解码前的字符串!
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string dfs()
{
string str = "", back = ""; //back是负责存储拼接字符的!
char ch; //为每次读入的字符
while (cin >> ch)
{
if (ch == '\n') //说明字符串已经读入完毕了!
break;
if (ch == '[') //处理当前字符串!
{
int t;
cin >> t; //下一个字符必然是数字!
str = dfs(); //解码压缩部分!
while (t --)
back += str; //则将压缩的字符进行解码t次。并赋值给back!
}
else if (ch == ']') return back;
else //否则最后一种情况就是字母了!
back += ch;
}
}
int main()
{
cout << dfs();
return 0;
}
二、模拟:
思路:
- 读入整个字符串以后,寻找压缩部分的字符。
- 从右往左找,找到的第一个字符: ’ [ ‘ ’[‘ ’[‘ 必然为压缩部分的最内层的压缩!可以自己画图模拟看看。那么我们要做的就是解码最内层的压缩部分。一层一层剖开!记录当前所找的 字符: [ 字符 :[ 字符:[ 的下标为: l l l;那么怎么剖开呢?
- 我们还差一个下标,即与之对应的字符: ′ ] ′ ']' ′]′,记该字符的下标为: r r r;然后将区间: [ l , r ] [l, r] [l,r] 里面的进行解码。
- 字符 [ [ [ 的后一个字符必为数字字符,那么我们可以将其取出来,然后转化为数字: c n t cnt cnt,然后将整个压缩部分进行 c n t cnt cnt 次累计!
其实我们从左往右找到的第一个字符: [ [ [,是最内层的压缩部分。而同样,我们可以同时累计字符: ] ] ],它也同样是最内层的部分,可能累计途中我们会遇到多个 ′ ] ′ ']' ′]′,但是一路不断更新 r r r 下去,直到遇到 字符: [ [ [,而最后一次统计的 ] ] ],必然是最内层的。 [ 和 ] [ 和 ] [和] 两个字符分别会遇到一次和多次!
代码:未完善!
#include<iostream>
using namespace std;
int main()
{
string str;
cin >> str;
while (true)
{
int l=-1, r=-1;
int len = str.size();
for (int i=len-1; i>=0; i --)
{
if (str[i] == ']') r = i;
if (str[i] == '[')
{
l = i;
break;
}
}
if (l == -1) break;
//l 后面的字符必然是:数字字符,取出该字符,因为我们需要利用到它!
//将其转坏为数字字符!
int cnt = str[l+1] - '0';
for (int i=0; i < cnt; i ++) //赋值cnt次!
str[l]
}
return 0;
}