黑马程序员技术交流社区

标题: 字符串的排列问题 [打印本页]

作者: 王清华0    时间: 2013-9-22 00:36
标题: 字符串的排列问题
本帖最后由 王清华0 于 2013-9-22 10:46 编辑

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

作者: 肥猫    时间: 2013-9-22 02:09
问题描述清除啊,什么叫字符串的所有排列。
作者: 王清华0    时间: 2013-9-22 08:45
肥猫 发表于 2013-9-22 02:09
问题描述清除啊,什么叫字符串的所有排列。

就是说,比如给定一个字符串"abc",输出所有可能的排列:abc  ,acb  ,bac   ,bca   ,cab   ,cba 。
作者: yting_xmei1129    时间: 2013-9-22 09:01
楼主说的应该是字符串的全排列吧!全排列,不重复排列,如果是固定长度的话使用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;
                        }
                }
        }
}

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

嗯,代码跑了跑没问题,正在理解,如果是固定长度呢。比如固定长度为6的一个字符串。就不需要递归了么?

作者: yting_xmei1129    时间: 2013-9-22 10:02
王清华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]);
                                }
                        }
                }
        }

}


如果长度在多点那不写死了、、、

作者: 王清华0    时间: 2013-9-22 10:36
yting_xmei1129 发表于 2013-9-22 10:02
早上好啊!固定长度的话 for 循环加 if 就可以弄出来了,就是太麻烦了点,不过也是最容易理解的了,下面 ...

早上好,确实有够麻烦,我看懂递归的那个了。还是用那个吧,这个 固定for循环对于编程太啰嗦了。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2