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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.itheima;

  2. import java.util.Scanner;

  3. public class Test7 {

  4.         /**
  5.          * 7、编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如: 原始字符串是"abc",打印得到下列所有组合情况: "a" "b"
  6.          * "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc" "acb" "bac" "bca" "cab" "cba"
  7.          *
  8.          * 思路:1,将字符串拆分为单个字符
复制代码


2 个回复

正序浏览
没有人帮忙。。。。。。。自己查出来了,贴出来让大家参考吧
  1. package com.itheima;

  2. import java.util.Scanner;

  3. public class Test7 {

  4.         /**
  5.          * 7、编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如: 原始字符串是"abc",打印得到下列所有组合情况: "a" "b"
  6.          * "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc" "acb" "bac" "bca" "cab" "cba"
  7.          *
  8.          * 思路:1,将字符串拆分为单个字符 2,使用递归算法进行组合
  9.          *                
  10.          */
  11.         //定义静态变量k 控制递归次数
  12.         static int k=1;
  13.         //自定义异常,用于跳出递归的死循环
  14.         @SuppressWarnings("serial")
  15.         static class StopException extends RuntimeException{}
  16.         public static void main(String[] args) {
  17.                  System.out.println("请输入所要转换的字母或单词!");
  18.                  //定义并初始化键盘读入语句
  19.                  Scanner sc = new Scanner(System.in);
  20.                  //声明字符串接收从键盘读取的字符串
  21.                  String str = sc.nextLine();
  22.                  //捕获自定义异常,用于跳出递归
  23.                 try {
  24.                         printfirst(str);
  25.                 } catch (StopException e) {
  26.                 }
  27.         }

  28.         public static void printfirst(String str) {
  29.                 //定义两个字符串数组并获取所输入字符串的单个字符加入到数组中
  30.                 //用于对双字符串的匹配合成。
  31.                 int x = str.length();
  32.                 String[] ch1 = new String[x];
  33.                 String[] ch2 = new String[x];
  34.                 for (int i = 0; i < str.length(); i++) {
  35.                         ch1[i] = str.substring(i, i + 1);
  36.                         ch2[i] = str.substring(i, i + 1);
  37.                 }
  38.                 //遍历数组输出题目要求的单个字符
  39.                 for (String string1 : ch1) {
  40.                         System.out.print(string1+" ");
  41.                 }
  42.                 //调用匹配的递归函数,并将数组ch1 ch2传进去
  43.                 myout(ch1, ch2);
  44.         }
  45.         //定义函数,该函数用于将得到的任意两个字符数组,匹配出不重复的任意组合并输出。
  46.         public static void myout(String[] ch1, String[] ch2) {
  47.                 //定义StringBuffer 用于储存组合后的字符。
  48.                 StringBuffer sbf = new StringBuffer();
  49.                 //定义字符串数组用于储存组合后的字符串
  50.                 String[] ch3 = null;
  51.                 //对递归循环次数控制的变量k+1
  52.                 k++;
  53.                 //外层循环遍历匹配字符
  54.                 for (int i = 0; i < ch1.length; i++) {
  55.                         //内层循环遍历匹配字符
  56.                         for (int j = 0; j < ch2.length; j++) {
  57.                                 // System.out.println(ch2.length);
  58.                                 //对传入的两个字符串数组进行匹配,被组合的字符串数组
  59.                                 //中的数据不包含原始字符则进行组合。
  60.                                 if (!(ch2[j].contains(ch1[i]))) {
  61.                                         //定义新的字符串接收组合后的字符串
  62.                                         String s = ch1[i] + ch2[j];
  63.                                         //将字符串和*加入sbf
  64.                                         sbf.append(s);
  65.                                         sbf.append("*");
  66.                                 }
  67.                         }
  68.                 }
  69.                 // 将sbf转化为字符串方便进行切割操作
  70.                 String s = sbf.toString();
  71.                 //System.out.println(s);
  72.                 //定义正则表达式并切割字符串加入字符数组中
  73.                 String regex = "[*]";
  74.                 ch3 = s.split(regex);
  75.                 //遍历输出字符串数组
  76.                 for (String string : ch3) {
  77.                         System.out.print(string+" ");
  78.                 }
  79.                 //判断循环次数,并抛出自定义异常以跳出递归
  80.                 if (k>=ch1.length){
  81.                         //System.out.println(k);
  82.                         throw new StopException();
  83.                 }
  84.                 //递归
  85.                 myout(ch1, ch3);
  86.         }
  87.        
  88. }
复制代码
回复 使用道具 举报
package com.itheima;

import java.util.Scanner;

public class Test7 {

        /**
         * 7、编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如: 原始字符串是"abc",打印得到下列所有组合情况: "a" "b"
         * "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc" "acb" "bac" "bca" "cab" "cba"
         *
         * 思路:1,将字符串拆分为单个字符 2,使用递归算法进行组合
         *
         */
        public static void main(String[] args) {
                // System.out.println("请输入所要转换的字母或单词!");
                // //定义并初始化键盘读入语句
                // Scanner sc = new Scanner(System.in);
                // //声明字符串接收从键盘读取的字符串
                // String str = sc.nextLine();
                print("sah");
        }

        public static void print(String str) {
                int x = str.length();
                String[] ch1 = new String[x];
                String[] ch2 = new String[x];
                for (int i = 0; i < str.length(); i++) {
                        ch1[i] = str.substring(i, i + 1);
                        ch2[i] = str.substring(i, i + 1);
                }
                myout(ch1, ch2);
        }

        public static void myout(String[] ch1, String[] ch2) {
                StringBuffer sbf = new StringBuffer();
                String[] ch3 = null;
                int k = 1;
                k++;
                for (int i = 0; i < ch1.length; i++) {
                        for (int j = 0; j < ch2.length; j++) {
                                // System.out.println(ch2.length);
                                if (!ch1[i].contains(ch2[j])) {
                                        String s = ch1[i] + ch2[j];
                                        sbf.append(s);
                                        sbf.append("*");
                                }
                        }
                }
                // 切割sbf
                String s = sbf.toString();
                System.out.println(s);
                String regex = "[*]";
                ch3 = s.split(regex);
                for (String string : ch3) {
                        System.out.println(string);
                }
                if (k <= ch1.length) {
                        myout(ch1, ch3);
                }
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马