您的位置:首页 > 其它

蓝桥杯考试 递归:全排列的方法

2018-03-16 10:48 260 查看
全排列共采用了两种递归的方法

第一种,依次让每个字母排在首位

public static List<String> G(String str) //每个字母做开头 依次加上后面的全排列
{
List<String> lst = new ArrayList<String>(); //返回此列表
if(str.length()==1) //出口,已经只剩一个元素了
{
lst.add(str);
return lst;
}
for(int i=0;i<str.length();i++)
{
char x = str.charAt(i); //取出每一个字母
List<String> t = G(str.substring(0, i)+str.substring(i+1)); //除去i的字符串的列表全排列
for(int k=0;k<t.size();k++) //该字母+每一个全排列加入列表
{
lst.add(""+x+t.get(k));
}
}
return lst;
}

该方法不够巧妙,无法筛选重复字母的全排列,必须再用set筛选一次 建议采取第二种方法

第二种:依次让字符串的每一个字母与其后面的每个字母交换一次 如果待交换的字母已经再temp字符串里面可找到,则跳过

public static void K(int cur,char[] aa)
{
String temp123 = ""; 每次递归新建一次
if(cur==aa.length)
{
System.out.println(Arrays.toString(aa));
}
else
{
for(int i = cur;i<aa.length;i++) //依次让该位置跟后面的每个位置交换一遍
{
if(temp123.indexOf(aa[i])==-1) //判断该字母有没有已经选过
{
temp123+=aa[i];
char temp=aa[i];aa[i]=aa[cur];aa[cur]=temp;
K(cur+1,aa);
temp=aa[i];aa[i]=aa[cur];aa[cur]=temp; //不用回溯,因为每次都新建一个新的

}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: