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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王清华0 中级黑马   /  2013-9-22 00:36  /  1286 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王清华0 于 2013-9-22 10:46 编辑

同学给出一道题,写出一个函数来输出一个字符串的所有排列,想了好久没有写出来,求大家给想个,另外希望能解释一下算法。
比如,给定字符串"abc",输出所有的排列顺序。abc ,acb,bca  ,bac  ,cba  ,cab。暂时不考虑重复字符的情况,即字符串内字符都是不重复的。

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

6 个回复

倒序浏览
问题描述清除啊,什么叫字符串的所有排列。
回复 使用道具 举报
肥猫 发表于 2013-9-22 02:09
问题描述清除啊,什么叫字符串的所有排列。

就是说,比如给定一个字符串"abc",输出所有可能的排列:abc  ,acb  ,bac   ,bca   ,cab   ,cba 。
回复 使用道具 举报
楼主说的应该是字符串的全排列吧!全排列,不重复排列,如果是固定长度的话使用for循环就可以弄出来,要是不固定长度的话就要使用递归了,以下是代码--->

public class StringArranged {
        public static void main(String[] args) {
                String str = "abcd";
                arranged(str.toCharArray(), 0);
        }

        public static void arranged(char[] str, int i) {
                if (i >= str.length)
                        return ;
                if (i == str.length - 1) {
                        System.out.println(String.valueOf(str));
                } else {
                        for (int j = i; j < str.length; j++) {
                                char temp = str[j];
                                str[j] = str[i];
                                str[i] = temp;

                                arranged(str, i + 1);

                                temp = str[j];
                                str[j] = str[i];
                                str[i] = temp;
                        }
                }
        }
}

有什么不明白的话可以问饿、、、
回复 使用道具 举报
yting_xmei1129 发表于 2013-9-22 09:01
楼主说的应该是字符串的全排列吧!全排列,不重复排列,如果是固定长度的话使用for循环就可以弄出来,要是 ...

嗯,代码跑了跑没问题,正在理解,如果是固定长度呢。比如固定长度为6的一个字符串。就不需要递归了么?
回复 使用道具 举报
王清华0 发表于 2013-9-22 09:27
嗯,代码跑了跑没问题,正在理解,如果是固定长度呢。比如固定长度为6的一个字符串。就不需要递归了么?
...

早上好啊!固定长度的话 for 循环加 if 就可以弄出来了,就是太麻烦了点,不过也是最容易理解的了,下面是固定3个长度的全排列,好麻烦、、、

public class Arranged {

        public static void main(String[] args) {
                char[] ch = "abc".toCharArray();
                for(int i=0; i<ch.length; i++){
                        for(int j=0; j<ch.length; j++){
                                if(i==j) continue;
                                for(int k=0; k<ch.length; k++){
                                        if(k==i || k==j) continue;
                                        System.out.println(ch +"..."+ch[j]+"..."+ch[k]);
                                }
                        }
                }
        }

}


如果长度在多点那不写死了、、、
回复 使用道具 举报
yting_xmei1129 发表于 2013-9-22 10:02
早上好啊!固定长度的话 for 循环加 if 就可以弄出来了,就是太麻烦了点,不过也是最容易理解的了,下面 ...

早上好,确实有够麻烦,我看懂递归的那个了。还是用那个吧,这个 固定for循环对于编程太啰嗦了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马