一.概述
回溯法有"通用的解題法"之稱,用它可以系統的搜索一個問題的所有解或任一解,它在問題的解空間中,按深度優先策略,從根結點出發搜索解空間樹,查看所有符合定義的解
二.算法框架
2.1 構造解空間樹
2.2 深度優先搜索解空間樹,查看所有的解
三.實例
3.1問題描述
這個問題來源於leetcode上的一個題目,有n對"("")",列出所有的排列組合,但是"("和")"必須匹配,如n=3有:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
3.2問題解決
3.2.1構造問題解空間
3.2.2深度優先搜索,收集所有的解即可
3.3代碼實現
class Solution {
public List<String> generateParenthesis(int n) {
StringBuilder sb=new StringBuilder("");
List<String> list=new ArrayList();
generateString(n, sb, list);
return list;
}
public void generateString(int n,StringBuilder s,List<String> list)
{
if(match(s,n))
{
list.add(s.toString());
return;
}
if(illegeal(s,n))
{
return;
}
s.append("(");
generateString(n,s,list);//回溯
s=s.delete(s.length()-1,s.length());
s.append(")");
generateString(n,s,list);
s=s.delete(s.length()-1,s.length());
}
public boolean illegeal(StringBuilder sb,int n)
{
return isFinish(sb,n)||compare(sb)<0;
}
public boolean match(StringBuilder sb,int n)
{
return getRightParenthesis(sb)==n&&compare(sb)==0;
}
public boolean isFinish(StringBuilder sb,int n)
{
return n<getRightParenthesis(sb);
}
public int getRightParenthesis(StringBuilder sb)
{
int num=0;
for(char c:sb.toString().toCharArray())
{
if('('==c)
{
num++;
}
}
return num;
}
public int compare(StringBuilder sb)
{
int result=0;
for(char c:sb.toString().toCharArray())
{
if('('==c)
{
result+=1;
}else
{
result-=1;
}
}
return result;
}
}