Java实现给定字符串或者链表的排列组合

需求介绍:

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; i<chs.length; i++){
            buf[len] = chs[i];
            per(buf, chs, len-1);
        }
    }
}

运行结果如下:
这里写图片描述
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; i<chs.length; ++i)
                System.out.print(chs[i]);
            System.out.println();
            return;
        }
        for(int i=start; i<len; i++){
            char 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<String[]> list = new ArrayList<String[]>();    
         list.add(color);    
         list.add(size);    
         list.add(other);    
         sorting (list, color, ""); 
    }

    public static void sorting(List<String[]> 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);
                    }
                }
            }
        }
    }
}

输出结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/xiaoxiao_yang77/article/details/80860149