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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.itheima;

import java.util.ArrayList;
import java.util.Scanner;

/**
* 第6题、编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符。 例如:<br>
* 原始字符串是"abc",打印得到下列所有组合情况:<br>
* "a" "b" "c" <br>
* "ab" "bc" "ca" "ba" "cb" "ac"<br>
* "abc" "acb" "bac" "bca" "cab" "cba"<br>
*
* @author wot_wangjinxin
* @version 1.0
*
*/
public class Test6 {
        public static void main(String[] args) {
                // 新建对象,调用对象的运行方法
                new Test6().run();
        }

        /**
         * 程序的运行入口方法<br>
         * run the program method
         */
        public void run() {
                String str;
                // 调用欢迎语句方法,给予用户使用提示
                welcome();
                // 循环从键盘获取数据,输入exit为退出
                Scanner sc = new Scanner(System.in);
                while (!(str = sc.nextLine()).equals("exit")) {
                        // 判断为非空字符串
                        if (!str.equals("")) {
                                printCombination(str);
                        }
                }
                // 关闭流,释放资源
                sc.close();
                System.out
                                .println("====================Test6 exit======================");
        }

        /**
         * 欢迎语句方法,对程序进行说明<br>
         * welcome text
         */
        public void welcome() {
                System.out
                                .println("=======================Test6========================");
                System.out.println("Please input a string or 'exit' to quit:");
        }

        /**
         * print the string's all combination. <br>
         * 打印字符串组合方法 <br>
         * 先取字符串的单个字符,根据这些字符分别拼接出长度为2,3。。。直至长度和原字符串相同的字符串
         *
         * @param str
         *            将要进行组合的字符串<br>
         *            the sting want to combination
         */
        public void printCombination(String str) {
                // 定义一个字符数组,并将字符串转换为字符数组后放入
                char[] ch = new char[str.length()];
                ch = str.toCharArray();

                // 对字符串进行判断是否有重复字符
                for (int i = 0; i < ch.length; i++) {
                        for (int j = i + 1; j < ch.length; j++) {
                                if (ch[i] == ch[j]) {
                                        System.out.println("字符串中含有重复的字符,请重新输入!");
                                        return;
                                }
                        }
                }
                // tempArr save temporary info, resultArr save the result
                // 定义两个List集合. tempArr用于存储临时数据,resultArr用于存储结果数据
                ArrayList<String> tempArr = new ArrayList<String>();
                ArrayList<String> resultArr = new ArrayList<String>();

                // 先获取所有长度为1的字符串到集合
                for (int i = 0; i < ch.length; i++) {
                        resultArr.add(ch[i] + "");
                }

                // 分别循环取出长度为i的字符串
                // 再与基字符串(长度为1的字符串)进行拼接获得i+1长度的字符串
                for (int i = 1; i < ch.length; i++) {

                        // 取出对应长度i的字符串,放入临时集合
                        for (String t : resultArr) {
                                if (t.length() == i) {
                                        tempArr.add(t);
                                }
                        }

                        // 取出临时集合中的字符串,进行拼接
                        for (String t : tempArr) {
                                for (int j = 0; j < ch.length; j++) {
                                        // 将不包含有对应基字符串的长度为i+1新字符串存入结果集合
                                        if (!t.contains(ch[j] + "")) {
                                                resultArr.add(t + ch[j]);
                                        }
                                }
                        }

                        // 清空临时集合
                        tempArr.clear();
                }
                // 定义计数变量,用于打印
                int count = 0;

                // 打印结果
                System.out.println("All Combinations:");
                for (String t : resultArr) {
                        System.out.print(t + "        ");
                        count++;
                        if (count % ch.length == 0) {
                                System.out.println();
                        }
                }
        }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马