- 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);
- }
- }
- }
复制代码
下面是解决方案:
- 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,使用递归算法进行组合
- *
- */
- //定义静态变量k 控制递归次数
- static int k=1;
- //自定义异常,用于跳出递归的死循环
- @SuppressWarnings("serial")
- static class StopException extends RuntimeException{}
- public static void main(String[] args) {
- System.out.println("请输入所要转换的字母或单词!");
- //定义并初始化键盘读入语句
- Scanner sc = new Scanner(System.in);
- //声明字符串接收从键盘读取的字符串
- String str = sc.nextLine();
- //捕获自定义异常,用于跳出递归
- try {
- printfirst(str);
- } catch (StopException e) {
- }
- }
- public static void printfirst(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);
- }
- //遍历数组输出题目要求的单个字符
- for (String string1 : ch1) {
- System.out.print(string1+" ");
- }
- //调用匹配的递归函数,并将数组ch1 ch2传进去
- myout(ch1, ch2);
- }
- //定义函数,该函数用于将得到的任意两个字符数组,匹配出不重复的任意组合并输出。
- public static void myout(String[] ch1, String[] ch2) {
- //定义StringBuffer 用于储存组合后的字符。
- StringBuffer sbf = new StringBuffer();
- //定义字符串数组用于储存组合后的字符串
- String[] ch3 = null;
- //对递归循环次数控制的变量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 (!(ch2[j].contains(ch1[i]))) {
- //定义新的字符串接收组合后的字符串
- String s = ch1[i] + ch2[j];
- //将字符串和*加入sbf
- 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.print(string+" ");
- }
- //判断循环次数,并抛出自定义异常以跳出递归
- if (k>=ch1.length){
- //System.out.println(k);
- throw new StopException();
- }
- //递归
- myout(ch1, ch3);
- }
-
- }
复制代码
使用抛出自定义异常解决递归死循环问题。 |
|