黑马程序员技术交流社区

标题: 今天面试的一道题,给大家分享一下,大家可以在下面做做 [打印本页]

作者: 习惯就好    时间: 2015-3-6 23:16
标题: 今天面试的一道题,给大家分享一下,大家可以在下面做做
本帖最后由 习惯就好 于 2015-3-8 10:03 编辑

编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"




当时有点卡壳,没做出来

作者: wdhm5423    时间: 2015-3-7 08:22
  1. 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
  2. 原始字符串是"abc",打印得到下列所有组合情况:
  3. "a" "b" "c"
  4. "ab" "bc" "ca" "ba" "cb" "ac"
  5. "abc" "acb" "bac" "bca" "cab" "cba"

  6. 思路:
  7. 1,若先输出a,剩下的bc,可以把b或c添加到a上,变成ab、ac,若把b添加到a上,剩下的就是c,
  8. 把c再添加到ab上,这样a开头的就有了,a、ab、ac、abc、acb
  9. 2,以上的思想就是先输出什么,就把这部分截取掉,然后再把剩下的字符截取出来再加到截取的字符上面,再输出;然后继续截取,直到剩下的字符串为空,可以考虑使用递归。
  10. */

  11. public class Test6 {

  12.         public static void main(String[] args) {
  13.                
  14.                 // 以下供测试使用
  15.                 Test6m("","abc");
  16.         }

  17.         private static void Test6m(String prestr,String newstr2) {
  18.                
  19.                 for(int i=0;i<newstr2.length();i++){
  20.                        
  21.                         StringBuilder builder=new StringBuilder(newstr2);
  22.                        
  23.                         //截取第i个字符,并添加到newpre上
  24.                         String newpre=prestr+newstr2.substring(i, i+1);
  25.                         //打印输出newpre
  26.                         System.out.println(newpre);
  27.                        
  28.                         //剩下的字符串
  29.                         String newstr=builder.deleteCharAt(i).toString();
  30.                        
  31.                         if("".equals(newstr))  break;
  32.                        
  33.                         //递归,每次截取一个字符
  34.                         Test6m(newpre,newstr);
  35.                 }
  36.         }
  37. }
复制代码

作者: gaopeng868988    时间: 2015-3-7 09:30
static int count = 0;
static char[] array = { 'a', 'b', 'c' };
static LinkedList<char[]> list = new LinkedList<char[]> ();
static int[] indexs = new int[3];
static int len = array.length;

public static void main(String[] args){
getSub ();
        for ( char[] cs : list ){
            System.out.println (Arrays.toString (cs));
        }
    }

    private static LinkedList<char[]> getSub (){
        while (count <= len){
            recursionSub (0, -1);
            count++;
        }
        return list;
    }
   
    private static LinkedList <char[]> recursionSub ( int ind, int start ){
start++;
if (start > count - 1){
return null;
}
for ( indexs[start] = 0; indexs[start] < len; indexs[start]++ ){
recursionSub (0, start);
if (start == count - 1){
char[] temp = new char[count];
for ( int i = count - 1; i >= 0; i-- ){
temp[start - i] = array[indexs[start - i]];
}
boolean flag = true;
for ( int i = 0; i < temp.length; i++ ){
for ( int j = i+1; j < temp.length; j++ ){
if (temp[i] == temp[j]){
flag = false;
break;
}
}
}
if (flag){
list.add (temp);
}
}
}
return list;
}

作者: 习惯就好    时间: 2015-3-8 00:13
wdhm5423 发表于 2015-3-7 08:22

很不错!
作者: 黑马小夏    时间: 2015-3-8 09:23
学习了0
作者: JuniorACMer    时间: 2015-3-8 09:44
多谢分享,受教了
作者: huangchunwei    时间: 2015-3-8 10:56
前来学习学习。。。
作者: Catface    时间: 2015-3-8 11:52
值得收藏,谢了
作者: 突然世界晴    时间: 2015-3-8 13:49
收藏了 感谢




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