给出一个正整数n,请给出所有的包含n个'('和n个')'的字符串,使得'('和')'可以完全匹配。
例如:
'(())()','()()()' 都是合法的;
'())()('是不合法的。
请按照__字典序__给出所有合法的字符串。
importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;public class Main{public static void main(String[] args) {Scanner in = newScanner(System.in);intn = in.nextInt();List<String> list = newArrayList<>();DFS(0, 0, n, "", list);for(inti=0;i<list.size()-1;i++){System.out.print(list.get(i)+",");}System.out.println(list.get(list.size()-1));}public static void DFS(intnum1, intnum2, intn, String str, List<String> list) {if(num1==n && num1+num2==2*n) list.add(str);if(num1<n && num1>=num2 && num1+num2<2*n) DFS(num1+1, num2, n, str+'(', list);if(num2<n && num1+num2<2*n) DFS(num1, num2+1, n, str+')', list);return;}}
import java.util.*;
#思路是“()”中间全部间隙添加"()",完整的左右括号带进去就不会有错序的左右括号。 #例:“1(2)3(4)5”,可以在数字的地方插入完整左右括号"()",得到其中一些三个括号的结果。以此类推递归下去,结束条件为括号数为所需时不再继续! #定义一个递归函数,函数使用全局变量(集合筛选掉重复),得到全部后使用列表排序,排好序后使用逗号分隔输出结果 while True: try: num = int(input()) result = set() def insertBracket(num,now,string): brackets = '()' if num>now: for i in range(0,len(string)): temp = string[:i]+brackets+string[i:] insertBracket(num,now+1,temp) elif num==now: global result result.add(string) insertBracket(num,1,'()') result = list(result) result.sort() print(",".join(result)) except Exception: break
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.ArrayList; public class Main { static ArrayList<String> list; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); list = new ArrayList<>(); dfs("", n, n); for(int i = 0; i < list.size(); i++){ if(i < list.size() - 1){ System.out.print(list.get(i) + ","); }else{ System.out.println(list.get(i)); } } } public static void dfs(String path, int restL, int restR) { if(restR < restL){ // 到目前为止追加了过量的右括号在左括号的左边,本次搜索无效 return; }else if(restL == restR){ // 左右两括号相等时追加左括号 if(restL > 0){ dfs(path + "(", restL - 1, restR); }else{ list.add(path); } }else{ // restR>restL 可以追加左括号,也可以追加右括号 if(restL > 0){ // 先尝试追加左括号以保证字典序 dfs(path + "(", restL - 1, restR); dfs(path + ")", restL, restR - 1); }else{ dfs(path + ")", restL, --restR); } } } }
package zhaoshangbank; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class FindvalidString{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); List<String> list = new ArrayList<>(); dfs(num,num,new String(),list); for(int i=0;i<list.size()-1;i++){ System.out.print(list.get(i)+","); System.out.print(list.get(list.size()-1)); } } public static void dfs(int left, int right, String str, List<String> res){ if(left<0||right<0||left>right) return ; if(left==0&&right==0) { res.add(str); return; } dfs(left-1,right,str+"(",res); dfs(left,right-1,str+")",res); } }
#include <bits/stdc++.h> using namespace std; void F(int l, int r, string s, vector<string> &v){ if(l>r) return; if(l==0 && r==0) v.push_back(s); if(l) F(l-1, r, s+'(', v); if(r) F(l, r-1, s+')', v); } int main(){ int n; scanf("%d", &n); string s; vector<string> v; F(n, n, s, v); for(int i=0;i<v.size();i++) if(i==v.size()-1) cout<<v[i]<<endl; else cout<<v[i]<<","; return 0; }
/* 作者:sweetiee 链接:https://leetcode-cn.com/problems/generate-parentheses/solution/jian-dan-dfsmiao-dong-by-sweetiee/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 力扣上的解法dfs搜索,n对括号,按照条件每次搜索增加左括号或者右括号 */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; public class Main{ static ArrayList<String> list = new ArrayList<>(); public static void main(String [] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); dfs(n,n,""); for(int i = 0;i<list.size();i++){ System.out.print(list.get(i)); if(i<list.size() - 1) System.out.print(","); } } //dfs搜索 public static void dfs(int left,int right,String curstr){ if(left==0 && right==0){ list.add(curstr); return; } if(left>0){//左括号还有剩余就往里面拼接左括号,因为括号是先左后右,优先拼接左 dfs(left-1,right,curstr + "("); } if(right>left){//如果右括号剩余量大于左括号,这时就需要添加右括号了,不然该字符串一定不是有效的 dfs(left,right-1,curstr + ")"); } } }借鉴力扣上面的思路,不喜勿喷,谢谢
import java.math.BigInteger; import java.util.*; public class Main { private static int n; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); n *= 2; dfs(0, 0, ""); Collections.sort(result); boolean flag = true; for (String s : result) { if (flag) { System.out.printf("%s", s);} else { System.out.printf(",%s", s); } flag = false; } } private static ArrayList<String> result = new ArrayList<>(); private static void dfs(int cur, int count, String s) { if (cur == n && count == 0) { result.add(s); return;} if (n - cur < count) { return; } if (count > 0) { dfs(cur+1, count-1, s+")");} dfs(cur+1, count+1, s+"("); } }
// 字典序就是优先放左括号( import java.io.*; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); br.close(); StringBuilder res = new StringBuilder(); backTrace(n,0,0,"",res); System.out.println(res.substring(1)); } private static void backTrace(int n, int leftBracket, int rightBracket, String tmp, StringBuilder res){ if(rightBracket > leftBracket) return; if(leftBracket > n) return; if(rightBracket == n) {res.append(','); res.append(tmp); return;} backTrace(n,leftBracket+1,rightBracket,tmp+"(",res); backTrace(n,leftBracket,rightBracket+1,tmp+")",res); } }
class MainActivity: def main(self): # Read the data n = int(input()) # Initialization results = set() self.__generate('', n, n, results) # Print the result results = sorted(list(results)) print(','.join(results)) def __generate(self, prefix, left, right, results): if not right: if not left: results.add(prefix) return if left: self.__generate(prefix + '(', left - 1, right, results) if right > left: self.__generate(prefix + ')', left, right - 1, results) if __name__ == '__main__': M = MainActivity() M.main()
#include<bits/stdc++.h> #define sum (n<<1) using namespace std; vector<string >res; string path; int n; void dfs(int len,int L,int R) { if(L < R || len > sum || sum -L <R ) return ; if(len == (n<<1)) { if(L==R) res.push_back(path); }else { if(L==R) { //只能加左边括号 path.push_back('('); dfs(len+1,L+1,R); path.pop_back(); }else { //l>r , 加左边 或者右边 path.push_back('('); dfs(len+1,L+1,R); path.pop_back(); path.push_back(')'); dfs(len+1,L,R+1); path.pop_back(); } } } int main(void) { cin>>n; dfs(0,0,0); for(int i=0;i<res.size()-1;++i) cout << res[i]<<","; cout << res.back()<<endl; }
public class Main{ private static Set<String> set=new TreeSet<>(); private static int sM=0; public static void main(String[] args){ Scanner sc=new Scanner(System.in); sM=sc.nextInt(); outPrint(1,"()"); String str=""; for(String s:set){ str=str+s+","; } System.out.println(str.substring(0,str.length()-1)); sc.close(); } public static void outPrint(int index,String str) { if(index==sM) set.add(str); for(int i=index;i<sM;) { for(int j=0;j<str.length();j++) { outPrint(i+1,str.substring(0,j)+"()"+str.substring(j)); } break; } } }
def symbol(left,right,temp,ans): if left == 0 and right == 0: ans.append(temp[:]) return ans #添加括号,一定先添加左括号,再添加右括号 if left: symbol(left - 1,right,temp + '(',ans) if left < right: symbol(left,right - 1,temp + ')',ans) while True: try: n = int(input()) ans = [] symbol(n,n,'',ans) ans.sort() print(','.join(ans)) except: break先加左括号才可以加右括号,每次添加时,剩余右括号数量不可小于剩余左括号数量
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main_02 { public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); List<String > list=new ArrayList<>(); help(n,n,"",list); for(int i=0;i<list.size()-1;i++){ System.out.print(list.get(i)+","); } System.out.println(list.get(list.size()-1)); } public static void help(int left,int right,String out,List<String > list){ if(left<0||right<0||left>right){ return; } if(left==0 && right==0){ list.add(out); return; } help(left-1,right,out+"(",list); help(left,right-1,out+")",list); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { //初始化代码略,sb代表((((~~)))) sb1代表最后输出,N代表输入 //注释中AB等价于() sb1.append(sb.toString()).append(','); int a=N-1; //初始时刻最右边的A的位置 while(a>0) { while(sb.length()-a>2&&sb.charAt(a+2)==')') {//最后一个位置的A可以向后移动 swap(sb,a,a+1); //向后移动并输出 sb1.append(sb.toString()).append(','); a++; } //下面寻找现在能够移动的最后一个A(second)的位置,将其向后移动一位 int prea=a-2; while(sb.charAt(prea)=='(') { prea-=2; if(prea<=0) { //没有还能移动的A,则输出终止 System.out.println(sb1.deleteCharAt(sb1.length()-1)); return; } } while(sb.charAt(prea)!='(') //找到second prea--; swap(sb,prea,prea+1); //second后移动一位 prea+=2; int t=sb.length()-2; while(t>=prea) { swap(sb,t,prea);//second之后的"("向前贴近 prea++; while(prea<=t&&sb.charAt(prea)!=')')prea++; t-=2; } sb1.append(sb.toString()).append(','); //寻找下次循环中最后一个A的位置<first> a=sb.lastIndexOf("())"); } System.out.println(sb1.deleteCharAt(sb1.length()-1)); } static void swap(StringBuilder sb, int a, int b) { char A=sb.charAt(a),B=sb.charAt(b); sb.setCharAt(a, B); sb.setCharAt(b, A); }
void dfs(int n, char c, int left, int right) { vec.push_back(c);//每一层搜索完必会回溯,所以这一步放在最开头, //反正最终都会回溯被pop if (left < right) {//left为当前左括号数目,right为右括号数目 return;//保证搜索中的每一步,左括号比右括号多 } if (n == 2 * num) { ans++; getSeq(); return; } //这两步同一般回溯法,只是不同情况传入 //字符不同,同时当有一种情况达到指定次数时候,该情况淘汰, //深度搜索用另一个方式进行 if (left < num) {//因为从第0层开始的,所以这里不能 '=' dfs(n + 1, '(', left + 1, right); vec.pop_back(); } if (right < num) { dfs(n + 1, ')', left, right + 1); vec.pop_back(); } } int main() { cin >> num; dfs(0, '\0', 0, 0);//从第0层开始,最开始插入一个不影响结果的字符 cout << '\n'; }
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public clas***ain { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int lcount = n - 1; int rcount = n; List<String> res = new ArrayList<>(); dfs(res,lcount,rcount,"("); for (int i = 0; i < res.size(); i++) { if (i != res.size() - 1) { System.out.print(res.get(i) + ","); } else System.out.println(res.get(i)); } } static void dfs(List<String> res, int lcount, int rcount, String s) { if ((rcount == 0 && lcount > 0) || rcount < 0 || lcount < 0 || (lcount > rcount)) { return; } if (rcount == 0 && lcount == 0) { res.add(s); } dfs(res,lcount - 1, rcount, s + "("); dfs(res,lcount,rcount - 1, s + ")"); } }