括号组合全排列

题目描述:

输入一个数字代表括号的数量,输出所有的括号组合
输入案例:
3

输出案例:
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"

代码示例:

include

include

include

using namespace std;

// 生成所有有效的括号组合
class Solution {
public:
vector generateParenthesis(int n) {
vector result;
string current;
backtrack(result, current, 0, 0, n);
return result;
}

private:
void backtrack(vector& result, string& current, int open, int close, int max) {
// 如果达到最大长度,添加到结果中
if (current.length() == max * 2) {
result.push_back(current);
return;
}

    // 可以添加左括号
    if (open < max) {
        current.push_back('(');
        backtrack(result, current, open + 1, close, max);
        current.pop_back();
    }

    // 可以添加右括号
    if (close < open) {
        current.push_back(')');
        backtrack(result, current, open, close + 1, max);
        current.pop_back();
    }
}

};

int main() {
int n;
cin >> n;

Solution solution;
vector<string> result = solution.generateParenthesis(n);

// 输出所有有效组合
for (const string& s : result) {
    cout << s << endl;
}

return 0;

}

以上是答案给的代码,说实话不好理解,明天再细说

自己写的代码有好多重复:
bool judge1(char a[],int n)
{
int l=0,r=0;
for(int i=0;i<2*n;i++)
{
if(a[i]'(')
l++;
if(a[i]
')')
r++;
if(r>l)
return false;
}
return l==r;
}

bool judge2(char a[],char b[],int n)
{
for(int i=0;i<2*n;i++)
{
if(a[i]!=b[i])
{
return false;
}
}
return true;
}

void kh(int start,char a[],int n)
{
if(start==2n)
{
for(int i=0;i<2
n;i++)
{
cout<<a[i];
}
cout<<endl;
}
for(int i=start;i<2*n;i++)
{
swap(a[i],a[start]);
if(!judge1(a,n))
continue;
kh(start+1,a,n);
swap(a[i],a[start]);
}
}

int main()
{
int n;
cin>>n;
char a[2n]; //括号的数量是n的两倍
int start=0; //判断开始交换的位置
for(int i=0,j=1;i<n
2,j<n*2+1;i=i+2,j=j+2)
{
a[i]='(';
a[j]=')';
}
kh(start,a,n);
system("pause");
return 0;
}

目前无论怎么写代码都无法将重复的输出结果去除,已经耗了两个小时了,明天再试吧

posted @ 2025-07-31 21:21  暗神酱  阅读(5)  评论(0)    收藏  举报