蓝桥杯考试 递归:全排列的方法
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; //不用回溯,因为每次都新建一个新的
}
}
}
}
第一种,依次让每个字母排在首位
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; //不用回溯,因为每次都新建一个新的
}
}
}
}
相关文章推荐
- 使用递归的方法生成一个序列的所有排列
- 蓝桥杯考试 递归题:搭积木
- 递归方法求全排列
- 蓝桥杯考试 递归题:算式填符号i
- (排列生成算法)枚举排列的两种方法:递归枚举和next_permutation (使用多用next_permutation)
- 用递归的方法判断整数组a[N]是不是升序排列
- 蓝桥杯 排列的个数 递归
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法
- 全排列的递归实现方法
- 蓝桥杯考试 递归题:代表团出访:重复字母的组合
- 华为面试题:用递归的方法判断整数组a[N]是不是升序排列
- 蓝桥杯---C语言凑算式(递归全排列、暴力)
- 蓝桥杯幸运数(递归方法)
- 用递归的方法来实现强大的全排列功能
- python递归全排列实现方法
- 用递归的方法来实现强大的全排列功能
- 递归方法的使用之一 -- 用递归进行排列组合
- 判断整形数组是按升序还是降序排列的,采用递归的方法
- 全排列 递归方法与非递归方法实现
- 用递归的方法判断整数组a[N]是不是升序排列