A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

©   米奇 中级黑马   /  2014-3-22 21:39  /  1506 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由   米奇 于 2014-3-23 10:43 编辑

原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"

12 个回复

正序浏览
import java.util.Enumeration;  
import java.util.Stack;  

public class Test7 {
        static String[][] stringss;  
    static String[] strings;  
    static int index;  

    public static void main(String[] args){  
        String stringsmain = "abcd";  
        char[] chars = stringsmain.toCharArray();   //将字符串stringsmain转换成一个数组
        stringss = new String[chars.length][];   
        combiantion(chars);   //调用combination方法,找到组合,并存储在string[][]中  
        for(int indexout=0; indexout<stringss.length; indexout++){   //遍历stringss[][]数组  
            for(int indexin=0; indexin<stringss[indexout].length; indexin++){  
                char[] arr = stringss[indexout][indexin].toCharArray();  
                permutation(arr, 0, arr.length);   //将组合传入permutation方法,并进行全排列  
            }  
            System.out.println();  
        }  
    }  

    public static void combiantion(char[] chs){   //该方法用于求解字符串的全部组合  
        if(chs.length == 0)  
            return;  
        Stack<Character> stack = new Stack<Character>();  
        for(int i = 1; i <= chs.length; i++){  
            int num = factorial(chs.length)/(factorial(i)*factorial(chs.length-i));  
            //求出不同字符串,不同长度下的组合的数量num  
            strings= new String[num];  
            index = 0;  
            //调用combine方法,求该字符串长度为i时的组合情况,并将数据保存到strings数组中  
            combine(chs, 0, i, stack);  
            stringss[i-1] = strings;  
        }  
    }  

    public static int factorial(int num){   //定义num的阶乘  
        int result = 1;  
        for(;num>=1;num--){  
            result *=num;  
        }  
        return result;  
    }  
    //该方法用于求解字符串在长度为number时的组合情况,主要利用了递归思想  
    public static void combine(char[] chars, int begin, int line, Stack<Character> stack){  
        //定义跳出递归的条件  
        if(line == 0){  
            Enumeration<Character> enumer = stack.elements();  
            strings[index] = "";  
            while(enumer.hasMoreElements()){  
                    strings[index] += enumer.nextElement().toString();  
            }  
            index++;  
            return;  
        }  
        if(begin == chars.length){  
            return;  
        }  
        stack.push(chars[begin]);//利用堆栈缓存数据  
        combine(chars, begin+1, line-1, stack);  
        stack.pop();  
        combine(chars, begin+1, line, stack);  
    }  
    //用于对字符数组进行全排列  
    public static void permutation(char[] arr, int index, int size){  
        //递归的出口,并用于输出当前排列  
        if (index+1 == size){  
            System.out.print("\"");  
            for (int i = 0; i < arr.length; i++){  
                System.out.print(arr[i] + "");  
            }  
            System.out.print("\"\t");  
        }  
        else {  
            for (int i = index; i < size; i++) {  
                //如果arr[i]和arr[index]相同则不进行操作,避免了存在相同元素时的重复排序,但由于组合的方法没有对相同字符加以辨别,所以最终效果并不好  
                if(i != index && arr[i] == arr[index])  
                    continue;  
                swap(arr, i, index);//如果不相同则交换两元素  
                permutation(arr, index+1, size);//进入下一层,下一层会对后面的元素进行排序或者打印出当前的排列  
                swap(arr, i, index);//再次换回交换前的状态,以便为下一个排列做准备  
            }  
        }  
    }  
    //用于交换数组元素的方法  
    public static void swap(char[] arr, int idx1, int idx2) {  
        char temp = arr[idx1];  
        arr[idx1] = arr[idx2];  
        arr[idx2] = temp;  
    }  
}  
给点分呗 -.-

回复 使用道具 举报
  米奇 发表于 2014-3-23 10:04
恩,是啊,看来能通过提问回答学习到很多知识,我问个很重要的问题,提问完了怎样结贴啊 ...

点编辑,然后就可以把主题改了!
回复 使用道具 举报
何伟超 发表于 2014-3-23 00:17
是啊,认真回答问题也会给技术分 ,但是认真的时候回答会不会多一点呢,多一点,提问的人会并不会更好理 ...

恩,是啊,看来能通过提问回答学习到很多知识,我问个很重要的问题,提问完了怎样结贴啊
回复 使用道具 举报
  米奇 发表于 2014-3-23 00:11
我看了啊,不是我不想问有技术含量的问题,只是技术还没到位啊,不是说吗,不要求技术多牛b只要很认真的 ...

是啊,认真回答问题也会给技术分 ,但是认真的时候回答会不会多一点呢,多一点,提问的人会并不会更好理解呢?不是每个人 基础都和你一样 ,你说对吧?所以,回答时候尽量图文并茂,这样即使不想给你加分都不好意思,你说是吧?
回复 使用道具 举报
何伟超 发表于 2014-3-23 00:06
刚才看了一下,感觉你发的帖子太没有技术含量了。你可以看一下加分规则,然后效仿这 发帖,不是说你一句 ...

我看了啊,不是我不想问有技术含量的问题,只是技术还没到位啊,不是说吗,不要求技术多牛b只要很认真的提问回答问题就可以吗?
回复 使用道具 举报
  米奇 发表于 2014-3-22 23:59
哈哈,开玩笑的。这技术分真不好挣啊,你看下我提的问题,为什么没有技术分呢? ...

刚才看了一下,感觉你发的帖子太没有技术含量了。你可以看一下加分规则,然后效仿这 发帖,不是说你一句话我们就可以给你加分的。
回复 使用道具 举报
何伟超 发表于 2014-3-23 00:02
不要急 ,我有时间会关注一下的。

好的,谢谢
回复 使用道具 举报
  米奇 发表于 2014-3-22 23:59
哈哈,开玩笑的。这技术分真不好挣啊,你看下我提的问题,为什么没有技术分呢? ...

不要急 ,我有时间会关注一下的。
回复 使用道具 举报
何伟超 发表于 2014-3-22 23:58
还是要靠自己的,我们只是一个辅助而已!!!

哈哈,开玩笑的。这技术分真不好挣啊,你看下我提的问题,为什么没有技术分呢?
回复 使用道具 举报
  米奇 发表于 2014-3-22 23:54
你就是传说中的版主啊,以后技术分就靠你了

还是要靠自己的,我们只是一个辅助而已!!!
回复 使用道具 举报
何伟超 发表于 2014-3-22 23:22
入学 测试还是基础测试呀?论坛都问了好几遍了,你可以找找

你就是传说中的版主啊:lol,以后技术分就靠你了:P
回复 使用道具 举报
入学 测试还是基础测试呀?论坛都问了好几遍了,你可以找找
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马