黑马程序员技术交流社区
标题:
编程列出一个字符串的全字符组合情况,原始字符串中没
[打印本页]
作者:
王建伟
时间:
2015-5-17 01:32
标题:
编程列出一个字符串的全字符组合情况,原始字符串中没
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);
}
}
复制代码
使用抛出自定义异常解决递归死循环问题。
作者:
王建伟
时间:
2015-5-17 01:34
前面代码陷入死循环
作者:
LoveMyself
时间:
2015-5-18 10:49
本帖最后由 LoveMyself 于 2015-5-18 10:58 编辑
楼主递归算法写的很赞,亮点:能想到通过设置静态变量k恰到好处的与自定义 RnutimeException 相结合,来准确的结束循环;
其中的小细节:1、StringBuffer 中的append 没必要写成:append(s);append("*");
用append(s + "*");就可以搞定了
2、String regex = "
";ch3 = s.split(regex); 感觉没必要呀换成ch3 = s.split("*"); 感觉就可以了呀
作者:
小悟空et
时间:
2015-5-21 15:49
真是学习了,我去琢磨琢磨了,谢谢分享
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2