标题
递归或者栈都能解决一类问题
递归较为关键的地方是结束条件
- 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
class Solution {
public:
string decodeString(string s) {
int i=0;
return decodeString(s,i);
}
string decodeString(string &s,int &i){
string res;
while(i<s.length()&&s[i]!=']'){
if(!isdigit(s[i]))
res+=s[i++];
else{
int n=0;
while(i<s.length()&&isdigit(s[i]))
n=n*10+s[i++]-'0';
i++; //是[,i++
string t=decodeString(s,i);
i++;//是],i++
while(n--)
res+=t;
}
}
return res;
}
};
结束条件
95
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<TreeNode*> GenerateTrees(int start, int end) {
if(end<start){
return {nullptr};
}
vector<TreeNode*> res;
for( int i = start;i<=end;i++){
vector<TreeNode*> leftTree = GenerateTrees(start, i-1);
vector<TreeNode*> rightTree = GenerateTrees(i+1, end);
for(auto left:leftTree){
for(auto right:rightTree){
TreeNode* root = new TreeNode(i);
root->left = left;
root->right = right;
res.push_back(root);
}
}
}
return res;
}
vector<TreeNode*> generateTrees(int n) {
if (n == 0) {
return {};
}
return GenerateTrees(1,n);
}
};
123
以1为根节点 进行左子树和右子树的递归查找,左右子树也是以其为根节点分别递归查找
第一个找到
第二个找到
以 2