给定一个字符串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 [开始] [末]已经计算,回报DP [开始] [末]。
- 运行从start + 1到end递增2的循环以找到它的对括号或“?”。
- 然后将字符串分成两半,通过调用递归函数来检查从start + 1到i – 1和i + 1到 end 的正确后续括号表达式。
- 如果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
Javascript
输出:
3
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。