黑马程序员技术交流社区
标题:
关于打印字符串的全排列问题求大神解答
[打印本页]
作者:
默默丶
时间:
2014-11-8 19:15
标题:
关于打印字符串的全排列问题求大神解答
import java.util.*;
/*7、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"*/
public class Test7 {
static int count = 1;
public static void main(String[] args) {
//选定一个字符串传入组合方法中
String str = "abcddgdse";
group(str);
}
private static void group(String str) {
// TODO Auto-generated method stub
//创建一个集合并且将字符串中的字符串变为子串然后存入集合中
List<String> list = new ArrayList<String>();
char[] chs = str.toCharArray();
for(int i = 0;i<chs.length;i++){
list.add(chs[i]+"");
}
//将只有两个字母的形式单独拿出来因为此时变量定义内循环初始变量为0
int length = str.length();
for(int x = 0;x<length;x++){
for(int y = 0;y<length;y++){
//判定元素之间是否有包含关系
if(!list.get(y).contains(list.get(x)))
//将不相同的元素相加得到新元素自动装拆箱
list.add(list.get(x)+list.get(y));
}
}
//定义集合长度和内循环的初始量sum传入方法中
int num = list.size();
int sum =length;
setList(list, length, num,sum);
}
private static void setList(List<String> list, int length, int num,int sum) {
//循环得位字母开始就必须是一位字母和上一次获得的字母相加 而不跟以前的相加
for(int x = 0;x<length;x++){
for(int y = sum;y<num;y++){
//判定元素之间是否有包含关系
if(!list.get(y).contains(list.get(x)))
//将不相同的元素相加得到新元素自动装拆箱
list.add(list.get(x)+list.get(y));
}
}
num = list.size();
//递归结束标记定义
if(count<length-2){
//运用数字排列组合的思想得到sum然后递归
sum=sum*(sum-count)+length;
count++;
setList(list,length,num,sum);
}
//最后递归完成,循环便利获取元素内容
else{
for(String s : list){
System.out.println(s);
}
}
}
}
复制代码
超过4个字母以上都只出来4个字母从1个到4个的全排列,没有一个5个的 求大神帮助
作者:
默默丶
时间:
2014-11-9 09:59
import java.util.*;
/*7、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"*/
public class Test7 {
static int count = 1;
public static void main(String[] args) {
//选定一个字符串传入组合方法中
String str = "abcdef";
group(str);
}
private static void group(String str) {
// TODO Auto-generated method stub
//创建一个集合并且将字符串中的字符串变为子串然后存入集合中
List<String> list = new ArrayList<String>();
char[] chs = str.toCharArray();
for(int i = 0;i<chs.length;i++){
list.add(chs[i]+"");
}
//将只有两个字母的形式单独拿出来因为此时变量定义内循环初始变量为0
int length = str.length();
for(int x = 0;x<length;x++){
for(int y = 0;y<length;y++){
if(!list.get(y).contains(list.get(x)))
list.add(list.get(x)+list.get(y));
}
}
//定义集合长度和内循环的初始量sum传入方法中
for(int x = 0;x<length;x++){
int num = list.size();
for(int y = length;y<num;y++){
//判定元素之间是否有包含关系
if(!list.get(y).contains(list.get(x)))
//将不相同的元素相加得到新元素自动装拆箱
list.add(list.get(x)+list.get(y));
}
}
for(String s : list){
System.out.println(s);
}
}
}
复制代码
看来只有自己来了 没人理我
作者:
air鹏
时间:
2014-11-9 15:54
/*
思路:
1.将每次字符串拆成字符数组再存入集合中.
2.先排列一个字符的排列,在排列两个字符的排列一次类推知道与字符串长度一样
3.每次都拿刚排列好的字符串与字符串的各个字符编列排列,产生长度加以的字符串排列
*/
import java.util.*;
class StringQuanPaiLie
{
//static int count = 1;
public static void main(String[] args)
{
String str="abcdef";
List<String> list=Stringsplit(str);
//System.out.println(" "+list);
for(int i=0;i<list.size();i++)
{
System.out.println(list.get(i));
}
System.out.println(list.size());
}
private static List<String> Stringsplit(String str)
{
int sum=str.length();//排列计数
int lie =str.length();
int count=str.length();
List<String> list= new ArrayList<String>();
char[] chs =str.toCharArray();//将字符串拆分成字符数组让后装入集合中
for(int i=0;i<chs.length;i++)
{
list.add(chs[i]+"");
}
while(lie>1)
{
group(list,count,sum,str);
count=count*--lie;//每多一个字符时产生的排列的个数
sum=count+sum;//排列累加的个数
//System.out.println("count"+count);
//System.out.println("lie"+lie);
//System.out.println("sum"+sum);
}
return list;
}
private static void group(List<String> list,int count,int sum,String str)
{
for(int x=0;x<str.length();x++)
{
for(int y =sum-count;y<sum;y++)
{
if(!list.get(y).contains(list.get(x)))
//将不相同的元素相加得到新元素自动装拆箱
list.add(list.get(x)+list.get(y));
}
}
}
}
复制代码
这是根据你的思路写的,练练手
作者:
zzg8888
时间:
2014-11-9 16:06
厉害,就抽到了这题
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2