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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liu1098 中级黑马   /  2015-2-14 11:26  /  1223 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
我的想法是:
1.先输入字符串"abc"
2,控制输出个数,每行遍历输出,第一行三个,第二行六个,第三行六个这样输出。
需要大神帮忙的是:
1,如何控制输出个数
2,遍历的时候怎么样才能没有重复字符
请各位大神提提建议指点一下小弟,小弟在此先谢过了。

9 个回复

倒序浏览
这道题我也不会  共同等待大神指点
回复 使用道具 举报
你这是测试题吗?
回复 使用道具 举报
  1. /**
  2. *
  3. *
  4. * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
  5. 原始字符串是"abc",打印得到下列所有组合情况:

  6. "a" "b" "c"

  7. "ab" "bc" "ca" "ba" "cb" "ac"

  8. "abc" "acb" "bac" "bca" "cab" "cba"
  9. * @author lwh
  10. *
  11. */
  12. class Test{
  13.         public static void main(String[] args) {
  14.                 StringBuilder str = new StringBuilder("abc");
  15.                 Set<String> set = new TreeSet<String>();
  16.                 char[] ch = str.toString().toCharArray();
  17.                 print(ch, new StringBuilder(), set, 0);

  18.                 System.out.println();
  19.                 System.out.println("----------------");

  20.                 Set<String> set2 = quChongFu(set);
  21.                 Iterator<String> it2 = set2.iterator();
  22.                 while (it2.hasNext()) {
  23.                         System.out.print(it2.next() + " ");
  24.                 }
  25.         }

  26.         // 去掉集合中重复的元素
  27.         /*
  28.          * set:需要除去重复字符元素的集合
  29.          */
  30.         public static Set<String> quChongFu(Set<String> set) {
  31.                 Set<String> set2 = new TreeSet<String>();
  32.                 Map<Character, Integer> map = null;
  33.                 Iterator<String> it2 = set.iterator();
  34.                 int count;
  35.                 while (it2.hasNext()) {
  36.                         map = new HashMap<Character, Integer>();
  37.                         count = 1;
  38.                         boolean flag = false;
  39.                         String str = it2.next();
  40.                         char[] ch = str.toCharArray();
  41.                         for (int i = 0; i < ch.length; i++) {
  42.                                 if (!map.containsKey(ch[i])) {
  43.                                         count = 1;
  44.                                         map.put(ch[i], count);
  45.                                 }
  46.                                 if (map.containsKey(ch[i])) {
  47.                                         map.put(ch[i], count);
  48.                                         count++;
  49.                                 }

  50.                         }
  51.                         // System.out.println(map);
  52.                         for (int j = 0; j < ch.length; j++) {
  53.                                 if (map.get(ch[j]) > 1) {
  54.                                         flag = false;
  55.                                         // System.out.println("r");
  56.                                         break;
  57.                                 } else

  58.                                         flag = true;
  59.                         }
  60.                         if (flag) {
  61.                                 // System.out.println("s");
  62.                                 set2.add(str);

  63.                         }
  64.                 }
  65.                 // System.out.println(set2);
  66.                 return set2;
  67.         }

  68.         // 利用递归打印所有组合
  69.         /*
  70.          * ch:需要打印在组合的字符数组
  71.          * subStr:子字符串缓存,每个组合临时保存的变量
  72.          * set:最后存入的集合
  73.          * cout:递归的层数,和ch参数的(长度)相等
  74.          */
  75.         public static void print(char[] ch, StringBuilder subStr, Set<String> set,
  76.                         int count) {
  77.                 // 递归一层自加一次
  78.                 count++;
  79.                 // 当递归层数大于字符数组长度时退出
  80.                 if (count > ch.length) {
  81.                         return;
  82.                 }
  83.                 for (int i = 0; i < ch.length; i++) {
  84.                         // 当前字符添加到缓存变量中
  85.                         subStr.append(ch[i]);
  86.                         // 打印所有组合,包括重复的
  87.                         System.out.print(subStr.toString() + ",");
  88.                         // 将缓存变量中的数据转换成字符串存入集合中
  89.                         set.add(subStr.toString());
  90.                         // 进入下一层,也就是字符数组的下一个字符
  91.                         print(ch, subStr, set, count);
  92.                         // 删除上次保存的最后一个字符,避免了字符重复
  93.                         subStr.deleteCharAt(subStr.length() - 1);
  94.                 }

  95.         }
  96. }
复制代码


回复 使用道具 举报

大神啊,万分感谢。
回复 使用道具 举报
guiqi225 发表于 2015-2-14 14:39
你这是测试题吗?

是的,其他的都好整,这道题不好整。
回复 使用道具 举报
rehan 中级黑马 2015-2-15 09:48:22
7#
遍历的时候怎么样才能没有重复字符。。。。。。。。。。。
回复 使用道具 举报
janstk 中级黑马 2015-2-15 21:11:50
8#
但疼的递归啊。。。
回复 使用道具 举报
janstk 发表于 2015-2-15 21:11
但疼的递归啊。。。

我能说我还是菜鸟么。
回复 使用道具 举报
huangchunwei 来自手机 中级黑马 2015-2-17 23:58:24
10#
又是递归啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马