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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© november 中级黑马   /  2014-2-18 22:54  /  1371 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文


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

点评

基础测试?  发表于 2014-2-18 23:36

评分

参与人数 1黑马币 +5 收起 理由
何伟超 + 5

查看全部评分

6 个回复

正序浏览
理论上内存足够大的情况下可以生成任意长度字符串的所有字符的组合
  1. /*
  2. * 需求:
  3. * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
  4. * 例:原始字符串是"abc",打印得到下列所有组合情况
  5. * "a" "b" "c"
  6. * "ab" "bc" "ca" "ba" "cb" "ac"
  7. * "abc" "acb" "bac" "bca" "cab" "cba"
  8. */
  9. import java.io.*;
  10. import java.util.*;
  11. public class BasicTest
  12. {

  13.         public static void main(String[] args) throws Exception
  14.         {
  15.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  16.                 String line = bufr.readLine();
  17.                
  18.                 if(!valiStr(line))
  19.                 {
  20.                         System.out.println("输入的字符串中有重复的字符");
  21.                         System.exit(0);
  22.                 }
  23.                
  24.                 char[] charArr = line.toCharArray();
  25.                 for(int x=1; x<=charArr.length; x++)
  26.                 {
  27.                         List<String> list = getCombineList(charArr, x);
  28.                         
  29.                         System.out.println(x+"个字符的组合共有"+getCombineNumber(charArr, x)+"种组合:");
  30.                         
  31.                         Iterator<String> it = list.iterator();
  32.                         while(it.hasNext())
  33.                         {
  34.                                 System.out.print(it.next()+" ");
  35.                         }
  36.                         System.out.println();
  37.                 }
  38.         }
  39.         
  40.         public static boolean valiStr(String str)
  41.         {
  42.                 char[] arr = str.toCharArray();
  43.                 List<String> list = new ArrayList<String>();
  44.                 for(int i=0; i<arr.length; i++)
  45.                 {
  46.                         String tmp = new String(arr,i,1);
  47.                         if(list.contains(tmp))
  48.                         {
  49.                                 return false;
  50.                         }
  51.                         list.add(tmp);
  52.                 }
  53.                 return true;
  54.         }
  55.         
  56.         public static int getCombineNumber(char[] charArr,int x)
  57.         {
  58.                 int len = charArr.length;
  59.                 int total = 1;
  60.                 for(int i=0; i<x; i++)
  61.                 {
  62.                         total *= (len-i);
  63.                 }
  64.                 return total;
  65.         }
  66.         
  67.         public static List<Integer> getIndexList(char[] charArr)
  68.         {
  69.                 List<Integer> indexList = new ArrayList<Integer>();
  70.                 for(int j=0; j<charArr.length; j++)
  71.                 {
  72.                         indexList.add(j);
  73.                 }
  74.                 return indexList;
  75.         }
  76.         
  77.         public static String getRandomStr(char[] charArr,int x)
  78.         {
  79.                 List<Integer> indexList = getIndexList(charArr);
  80.                 int ilNum = indexList.size();
  81.                
  82.                 Random r = new Random();
  83.                 char[] tmpArr = new char[x];
  84.                 for(int i=0; i<x; i++)
  85.                 {
  86.                         int t = r.nextInt(ilNum-i);
  87.                         tmpArr[i] = charArr[indexList.get(t)];
  88.                         indexList.remove(t);
  89.                 }
  90.                 return new String(tmpArr);
  91.         }
  92.         
  93.         public static List<String> getCombineList(char[] charArr,int x)
  94.         {
  95.                 int total = getCombineNumber(charArr, x);
  96.                
  97.                 List<String> list = new ArrayList<String>();
  98.                 while(true)
  99.                 {
  100.                         String str = getRandomStr(charArr, x);
  101.                         if(list.contains(str))
  102.                                 continue;
  103.                         list.add(str);
  104.                         if(list.size() == total)
  105.                                 break;
  106.                 }
  107.                 return list;
  108.         }
  109.         
  110. }
复制代码
回复 使用道具 举报

你这个是。。手动把它的每种组合情况都打印了- -!那要是原字符串很长或者有空格怎么办?
回复 使用道具 举报
我基础测试也有这一题。。还没学到吧。等学完我自己试着做看看。。先回复下
回复 使用道具 举报
  1. package com.mth.test;

  2. /*
  3. *上下对称
  4. "a" "b" "c"

  5. "ab"  "bc" "ca"
  6. "ba"  "cb" "ac"  
  7.    
  8. "abc" "bca" "cab"
  9. "cba" "acb" "bac"           
  10. *
  11. *
  12. * 解题思路: 把abc变成数组 数组有下标  根据下标组合来打印
  13. *
  14. * */
  15. public class CharTest {

  16.         public static void main(String[] args) {

  17.                 String string = "abc";
  18.                 // 变成字符数组
  19.                 char[] array = string.toCharArray();
  20.                 //第一行
  21.                 for (char a : array) {
  22.                         System.out.print(a);
  23.                         System.out.print("   ");
  24.                 }
  25.                 System.out.println();
  26.                 //第二行
  27.                 for (int i = 0; i < array.length; i++) {
  28.                         if (i == array.length - 1) {
  29.                                 System.out.print(array[array.length - 1] + ""
  30.                                                 + array[array.length - 3]);
  31.                                 System.out.print("   ");
  32.                                 System.out.print(array[array.length - 3] + ""
  33.                                                 + array[array.length - 1]);
  34.                         } else {
  35.                                 System.out.print(array[i] + "" + array[i + 1]);
  36.                                 System.out.print("   ");
  37.                                 System.out.print(array[i + 1] + "" + array[i]);
  38.                         }
  39.                         System.out.print("   ");
  40.                 }
  41.                 System.out.println();
  42.                
  43.                 //第三行
  44.                 for (int i = 0; i < array.length; i++) {
  45.                         if (i == 1) {
  46.                                 System.out.print(array[i] + "" + array[i + 1] + ""
  47.                                                 + array[i - 1]);
  48.                                 System.out.print("   ");
  49.                                 System.out.print(array[i - 1] + "" + array[i + 1] + ""
  50.                                                 + array[i]);
  51.                         } else if (i == 2) {
  52.                                 System.out.print(array[i] + "" + array[i - 2] + ""
  53.                                                 + array[i - 1]);
  54.                                 System.out.print("   ");
  55.                                 System.out.print(array[i - 1] + "" + array[i - 2] + ""
  56.                                                 + array[i]);
  57.                         } else {
  58.                                 System.out.print(array[i] + "" + array[i + 1] + ""
  59.                                                 + array[i + 2]);
  60.                                 System.out.print("   ");
  61.                                 System.out.print(array[i + 2] + "" + array[i + 1] + ""
  62.                                                 + array[i]);
  63.                         }
  64.                         System.out.print("   ");
  65.                 }
  66.         }
  67. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
  1. import java.io.*;
  2. import java.util.*;
  3. public class pllll {
  4. public static void main(String[] args)throws Exception {
  5. BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  6. String        p=br.readLine();  
  7. yy(br,p );       
  8. }
  9. public static void yy(BufferedReader br,String p ) throws Exception
  10. {
  11. int i,j;     String ee=p;          String r = null,t = null,q=null ;        
  12. List<String>list=new ArrayList<String>();

  13. ///////////////////////////////////////////////////////////////////          
  14.              for(i=0;i<p.length();i++)
  15.              {
  16.            //        sop(p.substring(i,i+1)+" ");////////////第一行
  17.              }
  18.    //        System.out.println();
  19. ////////////////////////////////////////////////////////////////////          
  20. for(i=0;i<p.length();i++)
  21. {
  22. for(j=0;j<p.length();j++)       
  23. {       
  24. if(i!=j)
  25. {
  26.     r=p.substring(i, i+1);
  27.     t=ee.substring(j,j+ 1);
  28.     q=r+t;
  29. list.add(q);
  30. //sop(q+" ");        ////////////第二行
  31. }
  32. }       
  33. }
  34. ////////////////////////////////////////////////////////////////////       
  35. Iterator<String> iterator = list.iterator();
  36. while(iterator.hasNext())
  37.                {
  38.              ee= iterator.next();
  39.              //sop(ee);
  40.            yy(ee,p);
  41.              }       

  42. }
  43. public static void yy(String ee,String p) throws Exception
  44. { List<String>list=new ArrayList<String>();
  45. int i,j;  int k=2;
  46. String r = null,t = null,q=null ;
  47. for(i=0;i<p.length();i++)
  48. {         
  49.     r=p.substring(i, i+1);
  50.     t=ee.substring(0, k);//as ad sa sd da ds ,(0, 2)就是1,2位的,每个(as)(ad)....都是1,2位的即sop(t+" ");输出as ad sa sd da ds
  51.     q=r+t;
  52.     list.add(q);
  53. sop(q+" ");       
  54. }       
  55. Iterator<String> iterator = list.iterator();
  56.              while(iterator.hasNext())
  57.             {
  58.               ee= iterator.next();
  59.          if(k<p.length()+1)
  60.            { k++;
  61.           yy(ee,p)         ;
  62.            }
  63.             }                   
  64. }
  65. public static void sop(Object obj)
  66. {
  67. System.out.print(obj);       
  68. }
  69. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马