java 的全排列和组合

//java 全排列
private static void Main(){
    Set<String > set = new HashSet<>();    //用于存储,去重
    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine;
    Full(set,0,s.length()-1,s.toCharArray());
    System.out.pringln(set);
}

//全排列的核心代码块
private static void Full(Set<String > set, int from, int to, char[] chars){
    if(from == to)
        set.add(new Set(chars));
    for(int i = from; i <= to; i++){
        swap(chars, from, i);
        Full(set, from + 1, to, chars);
        swap(chars, from, i);
    }
}

//交换代码块
private static void swap(char[] chars, int from, int i){
    char swap = chars[from];
    chars[from] = chars[i];
    chars[i] = temp;
}

//测试
public static void main(String []args){
    Main();
}

---------------------------------------------------------------------------------------------------------------------------------

//组合
/**
    *这里的例子是从自然数1,2,…,n,从中任取r个数,输出所有组合。
    *输入格式:
    *一行两个自然数n、r(1<n<21,1≤r≤n)。
    *输出样例 复制
    *     1  2  3
    *     1  2  4
    *     1  2  5
    *     1  3  4
    *     1  3  5
    *     1  4  5
    *     2  3  4
    *     2  3  5
    *     2  4  5
    *     3  4  5
*/
private static void Main(){
    Scannner scanner = new Scanner(System.in);
    int n = scanner.nextInt;
    int k = scanner.nextInt;
    List<ArrayList<Integer>> arr = new ArrayList<>();
    combine(arr, new ArrayList<Integer>, n, k, 1);
    for(List<Integer> list:arr){
        System.out.println(list);
    }
}

//核心代码
private static void combine(List<List<Integer>> arr, List<Integer> temp,int n, int k, int start){
    if(k == 0){
        arr.add(new ArrayList<>(temp));
        return;
    }
    for(int i = start; i <= n; i++){
        temp.add(i);
        combine(arr, temp, n, k - 1, i + 1);
        temp.remove(temp.size() - 1);
    }
}

//主方法
private static void Main(String[] args){
    Main();
}






累死我了,记事本写的,可能有写错的单词,太感谢Idea了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值