1、已知字符串chs = {‘a’, ‘b’, ‘c’},实现a,b,c的所有排列组合(可重复排列)
思路:
abc三个字符组成的所有长度为3的字符串,aaa,aab,aac……ccc 一共27种
利用递归的思想,第一个字符可以从abc中选择一个,三种选择,之后问题转化为abc组成长度为2的字符的情况,循环递归后可以求出所有的可能。控制好循环退出条件即可。
利用递归可以处理,不知道字符长度的情况下,即通用处理。如果知道长度,只需要利用多层循环,也可以得出结论。
public class Permutation {
public static void main(String[] args) {
char[] chs = {'a','b','c'};
per(new char[3], chs, chs.length-1);
}
public static void per(char[] buf, char[] chs, int len){
if(len == -1){
for(int i=buf.length-1; i>=0; --i)
System.out.print(buf[i]);
System.out.println();
return;
}
for(int i=0; i1);
}
}
}
运行结果如下:
2、已知字符串chs = {‘a’, ‘b’, ‘c’},实现a,b,c的所有排列组合(不可重复排列)
思路:
abc三个字符组成的所有长度为3的字符串,abc,acb,… 一共6种
利用递归,第一个字符串一共有n种选择,剩下的变成一个n-1规模的递归问题。而第一个字符的n种选择,都是字符串里面的。因此可以使用第一个字符与1-n的位置上进行交换,得到n中情况,然后递归处理n-1的规模,只是处理完之后需要在换回来,变成原来字符的样子。
public class Arrange {
public static void main(String[] args) {
char[] chs = {'a','b','c'};
arrange(chs, 0, chs.length);
}
public static void arrange(char[] chs, int start, int len){
if(start == len-1){
for(int i=0; iout.print(chs[i]);
System.out.println();
return;
}
for(int i=start; ichar temp = chs[start];
chs[start] = chs[i];
chs[i] = temp;
arrange(chs, start+1, len);
temp = chs[start];
chs[start] = chs[i];
chs[i] = temp;
}
}
}
3、已知三组字符串,从每一组中选择一个字符组成排列,如已知:
String[] color = { “红”, “蓝”,”黑”};
String[] size = { “S”, “M”, “L” };
String[] other = { “a”, “b” };
要得到结果:红,S,a、红,S,b、红,M,a…等组合,共计3*3*2=18种;利用递归算法,参考上面2的思路实现。
public class Arrange {
public static void main(String[] args) {
String[] color = { "红", "蓝","黑"};
String[] size = { "S", "M", "L" };
String[] other = { "a", "b" };
List list = new ArrayList();
list.add(color);
list.add(size);
list.add(other);
sorting (list, color, "");
}
public static void sorting(List list, String[] arrs, String str) {
for (int i = 0; i < list.size(); i++) {
//取得当前的数组
if (i == list.indexOf(arrs)) {
//迭代数组
for (String arr : arrs) {
arr = str + arr;
if (i < list.size() - 1) {
arr = arr + ",";
sorting(list, list.get(i + 1), arr);
} else if (i == list.size() - 1) {
System.out.println(arr);
}
}
}
}
}
}