回溯算法
程序员文章站
2022-03-19 12:03:22
...
一.概述
回溯法有"通用的解题法"之称,用它可以系统的搜索一个问题的所有解或任一解,它在问题的解空间中,按深度优先策略,从根结点出发搜索解空间树,查看所有符合定义的解
二.算法框架
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;
}
}