黑马程序员技术交流社区

标题: 哪位大神能帮忙搞一下下面的这道题? [打印本页]

作者: 菜鸟的求学路    时间: 2015-4-23 21:24
标题: 哪位大神能帮忙搞一下下面的这道题?
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
                        原始字符串是"abc",打印得到下列所有组合情况:
                         "a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc"
                "acb" "bac" "bca" "cab" "cba"
作者: shield    时间: 2015-4-23 21:41
  1. package com.itheima;
  2. /**
  3. * 5、 编程列出一个字符串的全字符组合情况,原始字符串中没
  4. 有重复字符,例如:
  5.                         原始字符串是"abc",打印得到下列所有组合情况:
  6.                         "a" "b" "c"
  7.                         "ab" "bc" "ca" "ba" "cb" "ac"
  8.                         "abc" "acb" "bac" "bca" "cab" "cba"
  9.                        
  10. * @author shenli
  11. *分析:
  12. *发现二排的字符由第一排排组合而成,而第三排的字符由第一排与第二排排列组合而成
  13. *而第一排字符是由原字符串分解成字符形成,而字符串长度正好跟打印行数一致
  14. *所以,可以建立一个函数,将第一排的数据传进去然后返回第二排数据
  15. *再由第一排数据与第二排数据得到第三排数据,
  16. *再由第一排数据与第三排数据得到第四排数据(如果字符串够长的话)
  17. *由此可以利用递归函数的特点,再由字符串长度来控制递归次数
  18. *思路:
  19. *1. 将源字符串转换成字符数组,为了使它能够方便运用,转成字符串数组
  20. *2. 因为每一行的元素个数不确定,需要一个长度可变的容器来装数据,使用List集合
  21. *3. 因为要使用递归,而生成第n行需要第n-1行的数据与第一行的数据,并且字符串长度控制递归次数
  22. *    因此, 函数要有三个参数, 第一行的数据,n-1行的数据,与字符串长度
  23. */
  24. import java.util.*;
  25. public class Test5 {

  26.         public static void main(String[] args) {
  27.                 // 建立一个字符串,并最终将其转换成字符类型数组strs
  28.                 String str = "abc";
  29.                 String[] strs = null;
  30.                 //用于转换字符串为字符串数组的函数
  31.                 strs = strToStrs(str);
  32.                 //打印字符串数组
  33.                 for(String s : strs)
  34.                 {
  35.                         System.out.print(s+" ");
  36.                 }
  37.                 System.out.println();
  38.                 //因生成规律为两个字符串数组生成下一个字符串数组
  39.                 //并由字符串长度控制循环次数,要传递三个参数
  40.                 //第二行的数据是有第一行与自己排列组合得到,因此应传两个strs
  41.                 tran(strs,strs,strs.length);
  42.                
  43.         }
  44.         //用于转换字符串str到字符串数组 例如 ”abc“-->”a“ ”b“ ”c“
  45.         public static String[] strToStrs(String str)
  46.         {
  47.                 char[] orichs = str.toCharArray();
  48.                 int len = orichs.length;
  49.                 String[] oristrs = new String[len];
  50.                 for(int x = 0 ; x<len ; x++)
  51.                 {
  52.                         oristrs[x] = orichs[x]+"";
  53.                 }
  54.                 return oristrs;
  55.         }
  56.         //用于根据规则打印每一行的数据
  57.         //ori表示第一行的原字符串生成的数组,nstr表示当前行数组,num用于控制循环的记号
  58.         public static String[] tran(String[] ori,String[] nstr, int num)
  59.         {
  60.                 //num(原字符串长度)用来控制打印行数,因第一行在外打印,所以从num-1开始
  61.                 if(--num>0)
  62.                 {
  63.                         //用List集合来存储所产生的下一行数据
  64.                         List<String> list = new ArrayList<String>();
  65.                         //嵌套循环来组合原字符串数组与当前行数组来生成下一行数组
  66.                         for(int x = 0;x<ori.length;x++)
  67.                         {
  68.                                 for(int y = 0 ;y<nstr.length;y++)
  69.                                 {
  70.                                         //原字符数组与当前行数组组合时应避免重复元素
  71.                                         if(!nstr[y].contains(ori[x]))
  72.                                         {
  73.                                                 //将生成的下一行数据存储到list中
  74.                                                 list.add(ori[x]+nstr[y]);
  75.                                                 //打印生成的数据
  76.                                                 System.out.print(ori[x]+nstr[y]+"  ");
  77.                                         }
  78.                                 }
  79.                         }
  80.                         //每行数据打印完换行
  81.                         System.out.println();
  82.                         //当条件未结束时要继续打印下一行
  83.                         return tran(ori,list.toArray(new String[0]),num);
  84.                 }
  85.                 //打印完毕,结束函数
  86.                 return null;
  87.         }
  88. }
复制代码

作者: 菜鸟的求学路    时间: 2015-4-23 22:06
shield 发表于 2015-4-23 21:41

谢谢啊    这个代码有点长,  我先研究研究:):handshake
作者: shield    时间: 2015-4-23 22:24
菜鸟的求学路 发表于 2015-4-23 22:06
谢谢啊    这个代码有点长,  我先研究研究

。。。 是有点乱。。
我基础测试的时候写的,希望能帮到你
作者: 菜鸟的求学路    时间: 2015-4-28 22:11
灰常感谢   虽然有点晚了




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