给定一个字符串str ,该字符串包含字符( , ) , { , } , [ , ]和? 。任务是查找在?时形成的平衡括号表达式的总数。可以用任何括号字符代替。
以下是一些平衡括号表达式的示例: {([])} , {()} [{}]等。
而且,不平衡的括号表达式: {[} , {()] , {()} [)等。
例子:
Input: str = “(?([?)]?}?”
Output: 3
({([()]]}), ()([()]{}) and ([([])]{}) are the only possible balanced expressions that can be generated from the input.
Input: str = “???[???????]????”
Output: 392202
方法:
- 如果n为奇数,则结果将始终为0 ,因为将不可能有平衡表达式。
- 如果n id甚至创建一个dp数组来存储预计算。
- 使用以下操作调用递归函数:
- 如果起始索引>结束索引,则返回1 。
- 如果已经计算了dp [start] [end],则返回dp [start] [end] 。
- 从开始+ 1到结束递增2来运行循环,以找到其对括号或’?’。
- 然后,通过调用递归函数,将字符串分成两半,以检查从start + 1到i – 1和i + 1到结束的正确的后续括号表达式。
- 如果st [start] =’?’和st [i] =’?’那么就可以形成总共3对括号对,从而将递归函数的结果乘以3 。
- 返回dp [开始] [结束]
下面是上述方法的实现:
C++
// C++ program to find number of balanced
// bracket expressions possible
#include
using namespace std;
typedef long long int lli;
// Max string length
const int MAX = 300;
// Function to check whether index start
// and end can form a bracket pair or not
int checkFunc(int i, int j, string st)
{
// Check for brackets ( )
if (st[i] == '(' && st[j] == ')')
return 1;
if (st[i] == '(' && st[j] == '?')
return 1;
if (st[i] == '?' && st[j] == ')')
return 1;
// Check for brackets [ ]
if (st[i] == '[' && st[j] == ']')
return 1;
if (st[i] == '[' && st[j] == '?')
return 1;
if (st[i] == '?' && st[j] == ']')
return 1;
// Check for brackets { }
if (st[i] == '{' && st[j] == '}')
return 1;
if (st[i] == '{' && st[j] == '?')
return 1;
if (st[i] == '?' && st[j] == '}')
return 1;
return 0;
}
// Function to find number of
// proper bracket expressions
int countRec(int start, int end, int dp[][MAX],
string st)
{
int sum = 0;
// If starting index is greater
// than ending index
if (start > end)
return 1;
// If dp[start][end] has already been computed
if (dp[start][end] != -1)
return dp[start][end];
lli i, r = 0;
// Search for the bracket in from next index
for (i = start + 1; i <= end; i += 2) {
// If bracket pair is formed,
// add number of combination
if (checkFunc(start, i, st)) {
sum = sum
+ countRec(start + 1, i - 1, dp, st)
* countRec(i + 1, end, dp, st);
}
// If ? comes then all three bracket
// expressions are possible
else if (st[start] == '?' && st[i] == '?') {
sum = sum
+ countRec(start + 1, i - 1, dp, st)
* countRec(i + 1, end, dp, st)
* 3;
}
}
// Return answer
return dp[start][end] = sum;
}
int countWays(string st)
{
int n = st.length();
// If n is odd, string cannot be balanced
if (n % 2 == 1)
return 0;
int dp[MAX][MAX];
memset(dp, -1, sizeof(dp));
return countRec(0, n - 1, dp, st);
}
// Driving function
int main()
{
string st = "(?([?)]?}?";
cout << countWays(st);
return 0;
}
Java
// Java program to find number of balanced
// bracket expressions possible
class GFG {
// Max string length
static int MAX = 300;
// Function to check whether index start
// and end can form a bracket pair or not
static int checkFunc(int i, int j, String st)
{
// Check for brackets ( )
if (st.charAt(i) == '(' && st.charAt(j) == ')')
return 1;
if (st.charAt(i) == '(' && st.charAt(j) == '?')
return 1;
if (st.charAt(i) == '?' && st.charAt(j) == ')')
return 1;
// Check for brackets [ ]
if (st.charAt(i) == '[' && st.charAt(j) == ']')
return 1;
if (st.charAt(i) == '[' && st.charAt(j) == '?')
return 1;
if (st.charAt(i) == '?' && st.charAt(j) == ']')
return 1;
// Check for brackets { }
if (st.charAt(i) == '{' && st.charAt(j) == '}')
return 1;
if (st.charAt(i) == '{' && st.charAt(j) == '?')
return 1;
if (st.charAt(i) == '?' && st.charAt(j) == '}')
return 1;
return 0;
}
// Function to find number of
// proper bracket expressions
static int countRec(int start, int end, int dp[][],
String st)
{
int sum = 0;
// If starting index is greater
// than ending index
if (start > end)
return 1;
// If dp[start][end] has already been computed
if (dp[start][end] != -1)
return dp[start][end];
int i, r = 0;
// Search for the bracket in from next index
for (i = start + 1; i <= end; i += 2) {
// If bracket pair is formed,
// add number of combination
if (checkFunc(start, i, st) == 1) {
sum = sum
+ countRec(start + 1, i - 1, dp, st)
* countRec(i + 1, end, dp, st);
}
// If ? comes then all three bracket
// expressions are possible
else if (st.charAt(start) == '?' && st.charAt(i) == '?') {
sum = sum
+ countRec(start + 1, i - 1, dp, st)
* countRec(i + 1, end, dp, st)
* 3;
}
}
// Return answer
return dp[start][end] = sum;
}
static int countWays(String st)
{
int n = st.length();
// If n is odd, string cannot be balanced
if (n % 2 == 1)
return 0;
int dp[][] = new int[MAX][MAX];
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
dp[i][j] = -1;
return countRec(0, n - 1, dp, st);
}
// Driving function
public static void main(String[] args)
{
String st = "(?([?)]?}?";
System.out.println(countWays(st));
}
}
// This code is contributed by ihritik
Python 3
# Python 3 program to find number of balanced
# bracket expressions possible
# Max string length
MAX = 300
# Function to check whether index start
# and end can form a bracket pair or not
def checkFunc(i, j, st):
# Check for brackets ( )
if (st[i] == '(' and st[j] == ')'):
return 1
if (st[i] == '(' and st[j] == '?'):
return 1
if (st[i] == '?' and st[j] == ')'):
return 1
# Check for brackets [ ]
if (st[i] == '[' and st[j] == ']'):
return 1
if (st[i] == '[' and st[j] == '?'):
return 1
if (st[i] == '?' and st[j] == ']'):
return 1
# Check for brackets { }
if (st[i] == '{' and st[j] == '}'):
return 1
if (st[i] == '{' and st[j] == '?'):
return 1
if (st[i] == '?' and st[j] == '}'):
return 1
return 0
# Function to find number of
# proper bracket expressions
def countRec(start, end, dp, st):
sum = 0
# If starting index is greater
# than ending index
if (start > end):
return 1
# If dp[start][end] has already
# been computed
if (dp[start][end] != -1):
return dp[start][end]
r = 0
# Search for the bracket in from next index
for i in range(start + 1, end + 1, 2):
# If bracket pair is formed,
# add number of combination
if (checkFunc(start, i, st)):
sum = (sum + countRec(start + 1, i - 1, dp, st) *
countRec(i + 1, end, dp, st))
# If ? comes then all three bracket
# expressions are possible
elif (st[start] == '?' and st[i] == '?'):
sum = (sum + countRec(start + 1, i - 1, dp, st) *
countRec(i + 1, end, dp, st) * 3)
# Return answer
dp[start][end] = sum
return dp[start][end]
def countWays( st):
n = len(st)
# If n is odd, string cannot be balanced
if (n % 2 == 1):
return 0
dp = [[-1 for i in range(MAX)]
for i in range(MAX)]
return countRec(0, n - 1, dp, st)
# Driver Code
if __name__ =="__main__":
st = "(?([?)]?}?"
print(countWays(st))
# This code is contributed by ita_c
C#
// C# program to find number of balanced
// bracket expressions possible
using System;
class GFG {
// Max string length
static int MAX = 300;
// Function to check whether index start
// and end can form a bracket pair or not
static int checkFunc(int i, int j, string st)
{
// Check for brackets ( )
if (st[i] == '(' && st[j] == ')')
return 1;
if (st[i] == '(' && st[j] == '?')
return 1;
if (st[i] == '?' && st[j] == ')')
return 1;
// Check for brackets [ ]
if (st[i] == '[' && st[j] == ']')
return 1;
if (st[i] == '[' && st[j] == '?')
return 1;
if (st[i] == '?' && st[j] == ']')
return 1;
// Check for brackets { }
if (st[i] == '{' && st[j] == '}')
return 1;
if (st[i] == '{' && st[j] == '?')
return 1;
if (st[i] == '?' && st[j] == '}')
return 1;
return 0;
}
// Function to find number of
// proper bracket expressions
static int countRec(int start, int end, int[, ] dp,
string st)
{
int sum = 0;
// If starting index is greater
// than ending index
if (start > end)
return 1;
// If dp[start, end] has already been computed
if (dp[start, end] != -1)
return dp[start, end];
int i;
// Search for the bracket in from next index
for (i = start + 1; i <= end; i += 2) {
// If bracket pair is formed,
// add number of combination
if (checkFunc(start, i, st) == 1) {
sum = sum
+ countRec(start + 1, i - 1, dp, st)
* countRec(i + 1, end, dp, st);
}
// If ? comes then all three bracket
// expressions are possible
else if (st[start] == '?' && st[i] == '?') {
sum = sum
+ countRec(start + 1, i - 1, dp, st)
* countRec(i + 1, end, dp, st)
* 3;
}
}
// Return answer
return dp[start, end] = sum;
}
static int countWays(string st)
{
int n = st.Length;
// If n is odd, string cannot be balanced
if (n % 2 == 1)
return 0;
int[, ] dp = new int[MAX, MAX];
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
dp[i, j] = -1;
return countRec(0, n - 1, dp, st);
}
// Driving function
public static void Main()
{
string st = "(?([?)]?}?";
Console.WriteLine(countWays(st));
}
}
// This code is contributed by ihritik
输出:
3