字符串的全排列和全组合

输入:abc

输出:bac,cba,acb,bca,cab,abc

全排列的问题:

public ArrayList<String> Permutation(String str) {
        ArrayList<String> list = new ArrayList<String>();
        if(str!=null && str.length()>0){
             helper(str.toCharArray(),list,0);
             Collections.sort(list);
        }
        return list;
    }
    public void helper(char[] chars,ArrayList<String> list,int i) {
        if(i==chars.length-1) {
            list.add(String.valueOf(chars));
            return;
        }
        else
        {
            for(int j=i;j<chars.length;j++) {
                if(i==j||chars[i]!=chars[j]) {
                   swap(chars,i,j);
                   helper(chars,list,i+1);
                   swap(chars,j,i);
                }
            }
        }
    }
    private void swap(char[] cs,int i,int j){
        char temp = cs[i];
        cs[i] = cs[j];
        cs[j] = temp;
    }

全组合:

public ArrayList<String> Comb(String str) {
        char[] chars = str.toCharArray();
        ArrayList<String> list = new ArrayList<String>();
        int combNum=1<<str.length();
        for(int i=1;i<combNum;i++) {
            StringBuffer temp=new StringBuffer();
            for(int j=0;j<str.length();j++) {
                int k=1<<j;
                if((k&i)!=0) {
                    temp.append(chars[j]);
                }

            }
            if(!list.contains(temp.toString()))
               list.add(temp.toString());
        }
        return list;
    }

打靶问题:

public int[] label= {0,1,2,3,4,5,6,7,8,9,10};
    public void Compute(int score,int num,ArrayList<Integer> list){
        if(score<0||score>(num+1)*10) return;
        if(num==0) {
            System.out.println(list);
        }
        for(int i=0;i<11;i++) {
            list.add(label[i]);
            Compute(score-label[i],num-1,list);
            list.remove(list.size()-1);
        }
    }

原文地址:https://www.cnblogs.com/smallJunJun/p/10560816.html

时间: 2024-11-08 19:52:07

字符串的全排列和全组合的相关文章

全排列和全组合实现

记得@老赵之前在微博上吐槽说,“有的人真是毫无长进,六年前某同事不会写程序输出全排列,昨天发邮件还是问我该怎么写,这时间浪费到我都看不下去了.” 那时候就很好奇全排列到底是什么东西,到底有多难? 今天复习的时候终于碰到这题了,结果果然自己太渣,看了好久都没明白,代码实现又是磕磕碰碰的.所以,就把它整理成笔记加深记忆,也希望能帮到和我一样的人. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.b

字符串数组全排列——逐个追加组合算法

我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 可以这样想:固定第一个字符a,求后面两个字符bc的排列.当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac;接着我们固定第一个字符b,求后面两个字符ac的排列.现在是把c放到第一位

全排列,全组合(dfs)

全排列 #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <string> #include <map> #include <iomanip> #include <algorithm> #include <queue> #include <stack> #include &

字符串的全组合

大家千万不要把全组合和全排列搞混了,给定一个字符串:abc, 全组合形式:a,b,c,ab,ac,bc,abc 全排列形式:abc,acb,bac,bca,cab,cba 下面我就讲一下全组合问题. 首先讲一下组合问题原理: n个元素选m个元素的组合问题的实现. 从后往前选取, 选定位置i后, 再在前i-1个里面选取m-1个. * 如: 1, 2, 3, 4, 5 中选取3个元素. * 1) 选取5后, 再在前4个里面选取2个, 而前4个里面选取2个又是一个子问题, 递归即可; * 2) 如果不

常见算法之全排列 全组合

全排列算法是一种比较常考的算法,他的做法也比较多样. 首先我们来看看最符合我们直观思考的,思路是这样的:假如没有重复元素时,传入一个数组A,并插入到另外一个数组B中,假如B中已经包含这个元素,则跳过,否则插入数组B.我们来看看具体代码: <span style="font-size:14px;">public static void permutation1(final String str, String buffer){ if (str.length() == buff

高效率的全组合算法(Java版实现)

博客上看到的一个算法,用Java实现了一个 算法描述: 算法说明:当n大于2时,n个数的全组合一共有(2^n)-1种. 当对n个元素进行全组合的时候,可以用一个n位的二进制数表示取法. 1表示在该位取,0表示不取.例如,对ABC三个元素进行全组合,  100表示取A,010表示取B,001表示取C,101表示取AC  110表示取AB,011表示取BC,111表示取ABC 注意到表示取法的二进制数其实就是从1到7的十进制数 推广到对n个元素进行全排列,取法就是从1到2^n-1的所有二进制形式 要

字符串的全排列(java)

差不多半个月没写博客了,今天再写一篇. 字符串全排列相信大家都不陌生,对于我来说真的是写了又忘,忘了又写,所以决定写成一篇博客,废话不多说下面我来分析问题: 问题描述:给定一个字符串写出它的全排列,例如ab,全排列是ab,ba,而abc的全排列abc,acb,bac,bca,cab,cba. 解题思路:我们以具体例子分析,假如abc,如上所示,它的全排列是不是就是把字符串中每一个字符,放在第一位,然后再对剩下的字符串做全排列,如把a放在第一位,剩下bc 全排列是bc,cb,组合起来就是abc,a

搜索入门练习题3 全组合 题解

题目出处:<信息学奥赛一本通>例5.2. 题目描述 设有 \(n\) 个数的集合 \(\{1,2,...,n\}\) ,从中任意取出 \(r\) 个数进行排列 \((r \le n)\) ,试列出所有的排列. 输入格式 输入包含两个正数 \(n,r(1 \le r \le n \le 10)\) 输出格式 输出从 \(n\) 个数的集合中选出 \(r\) 个数的所有组合,每个组合方案占一行.对于每个组合,按照从小到大的顺序输出组合中的所有元素,两两之间有一个空格分隔. 样例输入 3 2 样例输

剑指offer-拓展训练-字符的所有组合-全组合

/* 题目: 给定不含重复字符字符串的全组合. */ /* 思路: 递归法. 例给定abc,输出的组合长度为1,2,3. 对于长度为2的组合,分选择a(ab,ac)和不选择a的情况(bc). 选择a,则在剩余字符串中选择长度为1的字符组合: 不选择a,则在剩余字符串中选择长度为2的字符组合. */ #include<iostream> #include<stdio.h> #include<string> using namespace std; string curr;