黑马程序员技术交流社区

标题: 这个代码怎么写?感觉自己绕进去了。 [打印本页]

作者: 路西法    时间: 2014-3-13 16:19
标题: 这个代码怎么写?感觉自己绕进去了。
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
例如:
原始字符串是"abc",打印得到下列所有组合情况
“a“,”b“,”c“,”ab“,”ac“,”bc","abc"

还有一种输出是
"a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac""abc" "acb" "bac" "bca" "cab" "cba"


这个代码怎么写?感觉自己绕进去了。

作者: 上官睿鹏    时间: 2014-3-13 16:47
http://bbs.itheima.com/forum.php?mod=viewthread&tid=104635
点进去看看~之前有人问过这道题~
作者: syw02014    时间: 2014-3-13 18:54
希望能帮到你:
  1. public class AllSort{  
  2.     public static void main(String[] args) {  
  3.         char buf[]={'a','b','c'};  

  4.         perm(buf,0,buf.length-1);  
  5.     }  
  6.     public static void perm(char[] buf,int start,int end){  
  7.         if(start==end){//当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可  
  8.             for(int i=0;i<=end;i++){  
  9.                 System.out.print(buf[i]);  
  10.             }  
  11.             System.out.println();     
  12.         }  
  13.         else{//多个字母全排列  
  14.             for(int i=start;i<=end;i++){  
  15.                 char temp=buf[start];//交换数组第一个元素与后续的元素  
  16.                 buf[start]=buf[i];  
  17.                 buf[i]=temp;  
  18.                   
  19.                 perm(buf,start+1,end);//后续元素递归全排列  
  20.                   
  21.                 temp=buf[start];//将交换后的数组还原  
  22.                 buf[start]=buf[i];  
  23.                 buf[i]=temp;  
  24.             }  
  25.         }  
  26.     }  
  27. }
复制代码


作者: ‍杨博    时间: 2014-6-9 14:17
我也在考虑这个题
作者: 一顿一只牛    时间: 2014-8-7 21:14
请问大神们。递归在毕老师的哪个视频讲过呀?  
作者: 笑轻轻    时间: 2014-8-28 09:18
char[] ch=str.toCharArray();
       
}

        public static void zzz(String str){
                char[] ch=str.toCharArray();
                for(int a=0;a<ch.length;a++){
                        System.out.print(ch[a]+"\t");//打印出单个字母的集合
                }
               
                System.out.println();//换行
                for(int i=0;i<ch.length;i++){
                        for(int j=0;j<ch.length ;j++){//此处可以得到二个字母的组合共九个
                                if((ch[i]==ch[j]))//判断是否出现相同的字母
                                        continue;
                                System.out.print((ch[i]+""+ch[j])+"\t");//打印出二个字母的组合
                        }
                }
                System.out.println();//换行
                for(int b=0;b<ch.length;b++){
                        for(int c=0;c<ch.length;c++){
                                for(int d=0;d<ch.length;d++){
                                        if(ch[b]==ch[c]||ch[b]==ch[d]||ch[c]==ch[d])//判断是否出现相同的字母
                                                continue;
                                        System.out.print(ch[b]+""+ch[c]+""+ch[d]+"\t");//打印出三个字母的组合
                                }
                        }
                }
        }
作者: 叶尔纳    时间: 2014-10-11 22:59
看看这个,自己写的

package com.itheima;

import javax.swing.plaf.synth.SynthOptionPaneUI;

/*
*         原始字符串是"abc",打印得到下列所有组合情况:
*        "a" "b" "c"
*        "ab" "bc" "ca" "ba" "cb" "ac"
*        "abc" "acb" "bac" "bca" "cab" "cba"
*/
public class Test4 {
        public static void main(String[] args) {
                // 定义String 类型并赋值
                String a = "abc";

                // 将String类型转换成char类型的数组。
                char[] chr = a.toCharArray();

                // 遍历数组
                for (int i = 0; i < a.length(); i++) {
                        System.out.print(chr[i] + "  ");
                }
                System.out.print("\n");
                for (int i = 0; i < 2 * a.length(); i++) {
                        if (i < 3) {
                                System.out.print(chr[i] + "" + chr[(i + 1) % 3] + " ");
                        } else {
                                System.out.print(chr[(i - 2) % 3] + "" + chr[i - 3] + " ");
                        }
                }

                // "abc" "acb" "bac" "bca" "cab" "cba"
                System.out.print("\n");
                for (int i = 0; i < 2 * a.length(); i++) {
                        if (i < 2) {
                                System.out.print(chr[0] + "" + chr[i + 1] + chr[2 - i] + " ");
                        } else if (i < 4) {
                                System.out.print(chr[1] + "" + chr[(i - 2) * 2] + chr[i % 3]
                                                + " ");
                        } else {
                                System.out.print(chr[2] + "" + chr[i - 4] + chr[5 - i] + " ");
                        }
                }
        }
}
作者: 爽朗的菜籽    时间: 2014-10-18 22:24
笑轻轻 发表于 2014-8-28 09:18
char[] ch=str.toCharArray();
       
}

很感谢,终于有种方法可以看得懂了
作者: 金福林    时间: 2014-11-19 23:42
笑轻轻 发表于 2014-8-28 09:18
char[] ch=str.toCharArray();
       
}

这个3个循环的情况是实现了,可是多个呢?:(
作者: jinef    时间: 2015-1-9 18:40
笑轻轻 发表于 2014-8-28 09:18
char[] ch=str.toCharArray();
       
}

最笨也是最快最明白的代码
作者: 千山万水    时间: 2015-8-3 21:23
有点复杂呢
作者: pz_xiaoxie    时间: 2015-9-11 17:11
public static void zzz(String str){
                char[] ch=str.toCharArray();
                for(int a=0;a<ch.length;a++){
                        System.out.print(ch[a]+"\t");//打印出单个字母的集合


这个方法貌似能看懂
作者: 马塔非耶    时间: 2016-7-7 18:32
String s = "def";
                TreeSet<String> set = new TreeSet<>(new Comparator<String>() { //双列集合去重复
                        public int compare(String s1,String s2) {               
                                int num = s1.length() - s2.length();                //先以长度判断,小的在前
                                return num == 0 ? s1.compareTo(s2) : num;        //在以字典顺序判断;
                        }
                });
                for (int i = 0; i < s.length(); i++) {                                //第一位数
                        for (int j = 0; j < s.length(); j++) {                        //第二位数
                                for (int j2 = 0; j2 < s.length(); j2++) {        //第三位数
                                        set.add(s.charAt(j2) + "");                //将单个字符存进集合,它会自己去重复.
                                        if(s.charAt(j2) == s.charAt(j) | s.charAt(j2) == s.charAt(i) | s.charAt(i) == s.charAt(j)) { //判断三个不能重复
                                                continue;                                                                        //重复就跳出
                                        }else {                                                                                       
                                                set.add(s.charAt(i) + "" + s.charAt(j));                                //否则将两个字符的组合加进集合,它会自己去重复
                                                set.add(s.charAt(j) + "" + s.charAt(j2) + s.charAt(i));                        //将三个字符的组合加进集合,它会自己去重复
                                        }
                                       
                                }
                        }
                }                                                                                                        //遍历集合
                for (String string : set) {
                        System.out.print(string + " ");
                }
        }
}




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