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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汗血黑马 中级黑马   /  2014-3-4 15:19  /  1202 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
例如:
原始字符串是"abc",打印得到下列所有组合情况
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"。:dizzy:多一点代码注释,本人好分析理解,非常感谢!

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

7 个回复

倒序浏览
public class Test{

        public static void main(String[] args) {
               
                String s ="abc";
                char[] arr = s.toCharArray();
                new Test().Sort(arr);
        }
        //排列
        public static void Sort(char[] arr)
        {
                //输出第一行
                for(int i = 0;i<arr.length;i++)
                {
                        System.out.print("\""+arr[i]+"\"");
                }
                System.out.println();
                //输出第二行
                for(int i = 0;i<arr.length;i++)
                {
                        for(int j = 0;j<arr.length;j++)
                        {
                                if(arr[i]!=arr[j])
                                System.out.print("\""+arr[i]+arr[j]+"\"");
                        }
                }
                System.out.println();
                //输出第三行
                for(int i = 0;i<arr.length;i++)
                {
                        for(int j = 0;j<arr.length;j++)
                        {
                                for(int k = 0;k<arr.length;k++)
                                if(arr[i]!=arr[j]&&arr[i]!=arr[k]&&arr[j]!=arr[k])
                                System.out.print("\""+arr[i]+arr[j]+arr[k]+"\"");
                        }
                }
                System.out.println();
               
       
        }
}

点评

非常感谢!代码也很好理解。  发表于 2014-3-4 17:49

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
yogaa + 1 初学者很好理解,非常感谢~
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
我的这个代码有点局限性不能拓展,只能是三个字符,要各种字符的话,估计要用到递归,我完了再试试
  1. public class StringDemo {
  2.         public static void main(String[] args) {
  3.                 String string = "abc";
  4.                 char[] charArray = string.toCharArray();
  5.                 for (int i = 0; i < charArray.length; i++) {
  6.                         //一个字符
  7.                         System.out.println(charArray[i]);
  8.                         //两个字符
  9.                         for (int j = 0; j < charArray.length; j++) {
  10.                                 if(charArray[j] != charArray[i]) {
  11.                                         System.out.println(charArray[i] + "" +charArray[j] + "");
  12.                                         //三个字符
  13.                                         for (int k = 0; k < charArray.length; k++) {
  14.                                                 if(charArray[k] != charArray[j] && charArray[k] != charArray[i])
  15.                                                 System.out.println(charArray[i] + "" + charArray[j] + "" + charArray[k] + "");
  16.                                         }
  17.                                 }
  18.                         }
  19.                 }
  20.         }
  21. }
复制代码

点评

你的代码打印结果和条件不符哦,是所有的组合类型。 结果应该是:楼上!  发表于 2014-3-4 17:37

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
楼上,我觉得你这种方法空间复杂度过高,如果26个字母全部出现的话空间将占用极大,你不觉得这样会内存溢出吗?而且不一定就只有3位呀,你这个char数组不能确定开几维呀,只能按最大开,那就要建立一个26x26的char数组。这样不大合适吧,我觉得还是全排列好一点。楼主看看有什么启发
PS: 全排列代码
  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.print("  ");
  12.                 } else {
  13.                         for (int i = start; i <= end; i++) {// (让指针start分别指向每一个数)
  14.                                 char temp = buf[start];// 交换数组第一个元素与后续的元素
  15.                                 buf[start] = buf[i];
  16.                                 buf[i] = temp;

  17.                                 perm(buf, start + 1, end);// 后续元素递归全排列

  18.                                 temp = buf[start];// 将交换后的数组还原
  19.                                 buf[start] = buf[i];
  20.                                 buf[i] = temp;
  21.                         }
  22.                 }
  23.         }
  24. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
希望能帮到你:
  1. import java.util.Scanner;
  2. public class PaiLie
  3. {

  4.     private int len;
  5.     private char[] getRest(char[] arr,int i)
  6.     {
  7.             char[] rs=new char[arr.length-1];
  8.             for(int j=0;j<i;j++)
  9.                 rs[j]=arr[j];
  10.             for(int j=i+1;j<arr.length;j++)
  11.                 rs[j-1]=arr[j];
  12.             return rs;
  13.     }
  14.    
  15.     public void getResult_All(String content)
  16.     {
  17.             char[] arr=content.toCharArray();
  18.             len=arr.length;
  19.             PL_All("",arr,len);
  20.    
  21.     }
  22.     private void swap(char[] arr,int i,int j)
  23.     {
  24.         if(i==j)
  25.             return;
  26.         char tmp=arr[i];
  27.         arr[i]=arr[j];
  28.         arr[j]=tmp;
  29.         }
  30.     private void PL_All(String pre,char[] arr,int length)
  31.     {
  32.         if(length<1)
  33.                 return;
  34.         
  35.         for(int i=0;i<length;i++)
  36.         {
  37.                 char first=arr[i];
  38.                 swap(arr, i, length-1);
  39.                 PL_All(pre+first,arr,length-1);
  40.                 swap(arr, length-1,i);
  41.         }
  42.     }
  43.    
  44.     public static void main(String[] args)
  45.     {
  46.                 Scanner scanner=new Scanner(System.in);
  47.                 System.out.println("please input:");
  48.                 String content=scanner.nextLine();

  49. PaiLie  PL=new
  50. PaiLie ();
  51.                 PL.getResult_All(content);
  52.     }
  53. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
薛旻 发表于 2014-3-4 16:41
我的这个代码有点局限性不能拓展,只能是三个字符,要各种字符的话,估计要用到递归,我完了再试试
...

嘿嘿,为了简单,循环嵌在一起了,抱歉抱歉,意思还是可以理解的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马