平衡的表达式,例如给定位置在C ++中有开括号?
在给定整数m和位置'position []'(1 <= length(position [])<= 2m)的数组的情况下,找到可以由长度2m构成的适当括号表达式的方式数目,使得给定的位置有开括号。
注意:position []数组以(基于1的索引)[0,1,1,0]的形式提供。此处的1表示应将开括号设置在的位置。在值为0的位置,可以设置打开或关闭括号。
例子
Input: n = 2, position[] = [1, 0, 1, 0]Output: 1
The only possibility is given below:
[ ] [ ]
In this case, recursive and recursion implementing memorization approach will be explained.
算法
我们必须在给定数组adj1(say)中用方括号将所有位置标记为1。
我们以这种方式运行递归循环-
如果括号总数(括号从括号中减去)小于零,则返回0。
如果索引达到m且方括号总数等于0,则表示有解并返回1,否则返回0。
如果索引值有1预分配值,则必须递归地返回带有index + 1的函数,并增加总括号。
否则,我们必须递归地返回该函数,方法是在该位置或索引处插入方括号,然后将总方括号增加1 +在该索引处插入封闭方括号,然后将总方括号减少1,然后移至下一个索引,直到m。
以下是上述算法情况下的递归解决方案-
示例
// C++ application of above method implementing Recursion#include <bits/stdc++.h>
using namespace std;
//查找或查找适当括号表达式的功能
int find(int index1, int openbrk1, int m, int adj1[]){
//如果开括号小于0-
if (openbrk1 < 0)
return 0;
//如果索引到达表达式的末尾
if (index1 == m) {
//如果括号是平衡的
if (openbrk1 == 0)
return 1;
else
return 0;
}
//如果当前索引已分配了方括号
if (adj1[index1] == 1) {
//我们必须继续提高
//开括号的长度
return find(index1 + 1, openbrk1 + 1, m, adj1);
}
else {
//我们还必须插入open-
//作为该索引的方括号
return find(index1 + 1, openbrk1 + 1, m, adj1)
+ find(index1 + 1, openbrk1 - 1, m, adj1);
}
}
//驱动程式码
int main(){
int m = 2;
//打开括号
int adj1[4] = { 1, 0, 0, 0 };
//调用find函数计算答案
cout << find(0, 0, 2 * m, adj1) << endl;
return 0;
}
输出结果
2
记忆方式-通过实施记忆可以改善或优化上述算法的时间复杂度。
唯一要执行的是实现一个数组,以存储先前迭代的结果,因此,如果已经计算出该值,则不需要多次递归调用同一函数。
以下是必需的实现
// C++ application of above method implementing memorization#include <bits/stdc++.h>
using namespace std;
#define M 1000
//查找或查找适当括号表达式的功能
int find(int index1, int openbrk1, int m,
int dp1[M][M], int adj1[]){
//如果开括号小于0-
if (openbrk1 < 0)
return 0;
//如果索引达到或到达表达式的末尾
if (index1 == m) {
//如果括号是平衡的
if (openbrk1 == 0)
return 1;
else
return 0;
}
//如果已经存储在dp1中
if (dp1[index1][openbrk1] != -1)
return dp1[index1][openbrk1];
//如果当前索引已分配了方括号
if (adj1[index1] == 1) {
//我们必须继续提高开括号的长度
dp1[index1][openbrk1] = find(index1 + 1,
openbrk1 + 1, m, dp1, adj1);
}
else {
//我们必须向前插入open as-
// well作为该索引的方括号
dp1[index1][openbrk1] = find(index1 + 1, openbrk1 + 1, m, dp1, adj1) + find(index1 + 1, openbrk1 - 1, m, dp1, adj1);
}
//我们必须返回答案
return dp1[index1][openbrk1];
}
//驱动程式码
int main(){
//dp1数组以预先计算答案
int dp1[M][M];
int m = 2;
memset(dp1, -1, sizeof(dp1));
//打开括号
int adj1[4] = { 1, 0, 0, 0 };
//我们必须调用find函数来计算答案
cout<< find(0, 0, 2 * m, dp1, adj1) << endl;
return 0;
}
输出结果
2
时间复杂度:O(N2)
以上是 平衡的表达式,例如给定位置在C ++中有开括号? 的全部内容, 来源链接: utcz.com/z/322059.html