打印n對括號的所有有效組合(即左右括號正確配對)

/**
 * 功能:打印n對括號的所有有效組合(即左右括號正確配對)。java

 */app

 

兩種方法:ide

方法一:spa

[java] view plain copy.net

 

  1. /** 
  2.  * 思路:在括號的最前面或者原有的每對括號裏面插入一對括號。至於其餘任意位置,好比字符串的末尾,都會跟以前的狀況重複。 
  3.  * 注意:將字符串放進結果列表以前,必須檢查列表有無重複。 
  4.  * @param remaining 
  5.  * @return 
  6.  */  
  7. public static HashSet<String> generateParens(int remaining){  
  8.     HashSet<String> set=new HashSet<String>();  
  9.       
  10.     if(remaining==0)  
  11.         set.add("");  
  12.     else{  
  13.         HashSet<String> prev=generateParens(remaining-1);  
  14.         for(String str:prev){  
  15.             //括號內插入  
  16.             for(int i=0;i<str.length();i++){  
  17.                 if(str.charAt(i)=='('){  
  18.                     String s=insertInside(str,i);  
  19.                     set.add(s);//插入元素以前,HashSet會自動檢查有無重複  
  20.                 }  
  21.             }  
  22.             //括號最前面插入  
  23.             if(!set.contains("()"+str))  
  24.                 set.add("()"+str);  
  25.         }  
  26.     }                 
  27.     return set;       
  28. }  
  29.   
  30. /** 
  31.  * 在每對括號內插入 
  32.  * @param str 
  33.  * @param leftIndex 
  34.  * @return 
  35.  */  
  36. public static String insertInside(String str,int leftIndex){  
  37.     String left=str.substring(0,leftIndex+1);//左括號以後插入括號,因此須要leftIndex+1  
  38.     String right=str.substring(leftIndex+1);  
  39.     return left+"()"+right;  
  40. }  

 

 

方法二:blog

 

[java] view plain copy遞歸

 

  1. /** 
  2.  * 思路:從頭開始構造字符串,避免出現重複字符串。注意加入左括號和右括號,只要字符串仍然有效。 
  3.  * 每次遞歸調用,都有一個索引指向字符串的某個字符。選擇左括號和右括號: 
  4.  *      1)左括號:只要左括號尚未用完,就能夠插入左括號。 
  5.  *      2)右括號:只要不形成語法錯誤,就能夠插入右括號(右括號比左括號多,即語法錯誤)。 
  6.  * 所以,只需記錄容許插入的左右括號數目。若是還有左括號可用,就插入一個左括號,而後遞歸。 
  7.  * 若是後括號比左括號多,(即便用中的左括號比右括號多),就插入一個右括號,而後遞歸。 
  8.  *  
  9.  * 在字符串的每個索引對應位置插入左括號和右括號,並且絕對不會重複索引!!! 
  10.  * @param count 
  11.  * @return 
  12.  */  
  13. public static ArrayList<String> generateParens2(int count){  
  14.     ArrayList<String> list=new ArrayList<String>();  
  15.     char[] str=new char[count*2];  
  16.     addParens(list,count,count,str,0);  
  17.       
  18.     return list;  
  19. }  
  20.   
  21. public static void addParens(ArrayList<String> list, int leftRem, int rightRem, char[] str, int count) {  
  22.     // TODO Auto-generated method stub  
  23.     if(leftRem<0||rightRem<leftRem)  
  24.         return;  
  25.       
  26.     if(leftRem==0&&rightRem==0){  
  27.         String s=String.copyValueOf(str);  
  28.         list.add(s);  
  29.     }  
  30.       
  31.     if(leftRem>0){  
  32.         str[count]='(';  
  33.         addParens(list, leftRem-1, rightRem, str, count+1);  
  34.     }  
  35.       
  36.     if(rightRem>leftRem){  
  37.         str[count]=')';  
  38.         addParens(list, leftRem, rightRem-1, str, count+1);  
  39.           
  40.     }  
相關文章
相關標籤/搜索