用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:”4″不能在第三位,”3″与”5″不能相连.
解析:这是一道有条件的全排列问题,注意因为有两个2存在,因此结果要去除重复的排列。
解法:简单的dfs算法,使用java的类库可以极大缩短代码量并提高效率。
import java.util.ArrayList;
import java.util.List;
public class test3{
public static List<String> list = new ArrayList<String>();
public static void dfs(String str,String nstr){//深搜
if(nstr.length()==0){
if(str.indexOf("4")!=2 && str.indexOf("35")==-1 && str.indexOf("53")==-1){//去掉不符合条件的字符串
if(!list.contains(str)){//去重
list.add(str);
}
}
return;
}
for(int i=0;i<nstr.length();i++){
String temp = str + nstr.substring(i,i+1);
String ntemp = nstr.replaceFirst(nstr.substring(i,i+1),"");
dfs(temp,ntemp);
}
}
public static void main(String[] args){
dfs("","122345");
System.out.println(list.toString());
/*
for(String str : list){
System.out.println(str);
}
*/
}
}