人麻啦

笔试的时候一直在想 用指针做

不知道咋想的

题意 :

给一个字符串,让你输出字符串解码序列

字符串解码序列定义如下

"2[c]",

则输出 "cc"

括号可以嵌套

"2[wq3[ca]]"

则输出 "wqcacacawqcacaca"

"a2[c3[v]]"

则输出 acvvvcvvv

题解:

对递归理解还是不够深刻

遇到英文字符 ('a' - 'z') 直接附加到答案串末尾

遇到 '[' 找到需要处理子串递归调用并返回这部分的答案

遇到 ']' 根据前面的数字前缀决定加几个返回串

遇到 数字 进行计数

#include <iostream>
#include <string>


using namespace std;

string decodeString(string str) {
        // write code here
        string ans;
        int len = str.size();
        int cntstr = 1;//默认串数目为1
        int number_cnt = 0;//串前面是否有数字
        string retstring;
        
        for(int i = 0;i < len; i++ ){
            
            
            if(str[i]<= '9' && str[i] >= '0'){
                if(number_cnt)
					cntstr = cntstr*10 + str[i] - '0';
				else{
					number_cnt = 1;
					cntstr = str[i] - '0';
				}
			}
            else if(str[i] == '['){
            	
            	int lbraket = 1;//找合法子密码关键
            	
            	string ins;
            	while(i + 1 < len){
            		
            		if(str[i + 1] == ']' && lbraket == 1) break; 
            		
            		i++;
            		if(str[i] == '[') lbraket++;
            		else if(str[i] == ']') lbraket--;
            		ins += str[i];
				}
            	cout << ins << endl;
            	retstring = decodeString(ins);
            	cout << retstring <<endl;
			}
			else if(str[i] ==']'){
                
                for(int j = 0;j < cntstr;++j)
                	ans += retstring;
            	retstring.clear();
            	
            	number_cnt = 0;
            	cntstr = 1; 
            }
            else 
            	ans += str[i];
        }
        
        return ans;
}
int main(){
	
	string s;
	
	cin >> s;
	
	cout << decodeString(s);
	
	return 0;
}