黑马程序员技术交流社区
标题:
哪位大神能帮忙搞一下下面的这道题?
[打印本页]
作者:
菜鸟的求学路
时间:
2015-4-23 21:24
标题:
哪位大神能帮忙搞一下下面的这道题?
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc"
"acb" "bac" "bca" "cab" "cba"
作者:
shield
时间:
2015-4-23 21:41
package com.itheima;
/**
* 5、 编程列出一个字符串的全字符组合情况,原始字符串中没
有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
* @author shenli
*分析:
*发现二排的字符由第一排排组合而成,而第三排的字符由第一排与第二排排列组合而成
*而第一排字符是由原字符串分解成字符形成,而字符串长度正好跟打印行数一致
*所以,可以建立一个函数,将第一排的数据传进去然后返回第二排数据
*再由第一排数据与第二排数据得到第三排数据,
*再由第一排数据与第三排数据得到第四排数据(如果字符串够长的话)
*由此可以利用递归函数的特点,再由字符串长度来控制递归次数
*思路:
*1. 将源字符串转换成字符数组,为了使它能够方便运用,转成字符串数组
*2. 因为每一行的元素个数不确定,需要一个长度可变的容器来装数据,使用List集合
*3. 因为要使用递归,而生成第n行需要第n-1行的数据与第一行的数据,并且字符串长度控制递归次数
* 因此, 函数要有三个参数, 第一行的数据,n-1行的数据,与字符串长度
*/
import java.util.*;
public class Test5 {
public static void main(String[] args) {
// 建立一个字符串,并最终将其转换成字符类型数组strs
String str = "abc";
String[] strs = null;
//用于转换字符串为字符串数组的函数
strs = strToStrs(str);
//打印字符串数组
for(String s : strs)
{
System.out.print(s+" ");
}
System.out.println();
//因生成规律为两个字符串数组生成下一个字符串数组
//并由字符串长度控制循环次数,要传递三个参数
//第二行的数据是有第一行与自己排列组合得到,因此应传两个strs
tran(strs,strs,strs.length);
}
//用于转换字符串str到字符串数组 例如 ”abc“-->”a“ ”b“ ”c“
public static String[] strToStrs(String str)
{
char[] orichs = str.toCharArray();
int len = orichs.length;
String[] oristrs = new String[len];
for(int x = 0 ; x<len ; x++)
{
oristrs[x] = orichs[x]+"";
}
return oristrs;
}
//用于根据规则打印每一行的数据
//ori表示第一行的原字符串生成的数组,nstr表示当前行数组,num用于控制循环的记号
public static String[] tran(String[] ori,String[] nstr, int num)
{
//num(原字符串长度)用来控制打印行数,因第一行在外打印,所以从num-1开始
if(--num>0)
{
//用List集合来存储所产生的下一行数据
List<String> list = new ArrayList<String>();
//嵌套循环来组合原字符串数组与当前行数组来生成下一行数组
for(int x = 0;x<ori.length;x++)
{
for(int y = 0 ;y<nstr.length;y++)
{
//原字符数组与当前行数组组合时应避免重复元素
if(!nstr[y].contains(ori[x]))
{
//将生成的下一行数据存储到list中
list.add(ori[x]+nstr[y]);
//打印生成的数据
System.out.print(ori[x]+nstr[y]+" ");
}
}
}
//每行数据打印完换行
System.out.println();
//当条件未结束时要继续打印下一行
return tran(ori,list.toArray(new String[0]),num);
}
//打印完毕,结束函数
return null;
}
}
复制代码
作者:
菜鸟的求学路
时间:
2015-4-23 22:06
shield 发表于 2015-4-23 21:41
谢谢啊 这个代码有点长, 我先研究研究:):handshake
作者:
shield
时间:
2015-4-23 22:24
菜鸟的求学路 发表于 2015-4-23 22:06
谢谢啊 这个代码有点长, 我先研究研究
。。。 是有点乱。。
我基础测试的时候写的,希望能帮到你
作者:
菜鸟的求学路
时间:
2015-4-28 22:11
灰常感谢 虽然有点晚了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2