黑马程序员技术交流社区
标题:
字符串的全字符组合情况
[打印本页]
作者:
刘晶
时间:
2014-4-10 18:46
标题:
字符串的全字符组合情况
这个程序没有看明白,哪位大神给我加上注释呀,主要是 recursionSub不知道怎么运行的,有单步调试看着也很乱,帮帮忙
package com.itheima;
/**
* 第七题 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
例如:
原始字符串是"abc",打印得到下列所有组合情况
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
*/
import java.util.*;
public class Test11 {
static int n,count = 0;
static char[] array = { 'a', 'b', 'c' };
static LinkedList <char[]> list = new LinkedList<char[]> ();//转化为集合
static int[] indexs = new int[3];
static int len = array.length;
public static void main(String[] args){
getSub ();
for ( char[] cs : list ) //遍历list
{
//n++;
// if(n%3!=0)
System.out.println(cs);
// else System.out.println(cs);
}
}
private static LinkedList<char[]> getSub () //获取
{
while (count <= len){
recursionSub (-1);
count++;
}
return list;
}
private static LinkedList <char[]> recursionSub ( int start )
{
start++;
if (start > count - 1)
{
return null;
}
for ( indexs[start] = 0; indexs[start] < len; indexs[start]++ )
{
recursionSub (start);
if (start == count - 1)
{
char[] temp = new char[count];
for ( int i = count - 1; i >= 0; i-- )
{
temp[start - i] = array[indexs[start - i]];
}
boolean flag = true;
for ( int i = 0; i < temp.length; i++ )
{
for ( int j = i+1; j < temp.length; j++ )
{
if (temp[i] == temp[j])
{
flag = false;
break;
}
}
}
if (flag)
{
list.add (temp);
}
}
}
return list;
}
}
作者:
黑马_白马
时间:
2014-6-7 23:22
亲,我也没看懂~~~同求啊……
作者:
〇veに
时间:
2014-6-8 11:23
这个函数好像是吧所有情况都列出来。
作者:
李利威
时间:
2014-8-4 23:06
好麻烦啊
作者:
xiaoxiaofeng
时间:
2014-8-6 21:41
又学习了
作者:
lpc4276139
时间:
2014-8-10 22:38
表示木有看懂哦
作者:
0小菜鸟0
时间:
2014-8-17 11:01
幸好字符的长度是3,要是多点 我估计你的电脑内存都装不下你的代码
作者:
0小菜鸟0
时间:
2014-8-17 18:05
class AbcTest
{
public static void main(String[] args){
math1();
}
public static void math1(){
String str = "abc";
char[] ch = str.toCharArray();//变成字符形式,
for (int i = 0; i<str.length(); i++)
{
String str1 = "";//所有可能字符的变量
str1 = str1 + ch[i];//取第一个字符
System.out.print(str1+" ");
for (int j = 0; j<str.length(); j++)
{
//当第三层循环返回来的时候,字符串的长度是两个,需要给其重新赋值,保持第一个字符不变,其他两个在取值
if (str1.length() == 2)
str1 = "" + ch[i];
if (!math(str1,ch[j]))
{
continue;
}else{
str1 = str1 + ch[j];
System.out.print(str1+" ");
}
for (int k = 0; k<str.length(); k++)
{
if (!math(str1,ch[k]))
{
continue;
}else{
str1 = str1 + ch[k];
System.out.print(str1 + " ");
//保持前两个数不变,变换第三个字符
str1 = "" + ch[i] + ch[j];
}
}
}
}
}
//判断这个字符串里面是否存在这个字符,存在返回false,不存在返回true
public static boolean math(String str,char ch){
char[] ca = str.toCharArray();
boolean b = true;
for (int i = 0; i<ca.length; i++)
{
if (ca[i]==ch)
b = false;
}
return b;
}
}
复制代码
作者:
笑轻轻
时间:
2014-8-24 16:22
怎么会有这么复杂
作者:
黄宽
时间:
2014-10-18 13:13
我也碰到这题啊,赶脚有难度啊:L
作者:
壹贰叁
时间:
2014-11-21 23:25
package com.itheima;
import java.awt.List;
import java.util.ArrayList;
/**
* 第七题 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
例如:
原始字符串是"abc",打印得到下列所有组合情况
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
思路:1 每行字符个数都是递增 2 下一行的字符是建立在上一行的基础上得到的
即在将第一行字符串长度限定为1,第二行为2....,在第一行数据基础上{a,b,c},创建第二行数据,遍历字符串中所字符,并与第一行数据组合。注意每行字符串长度限制
*/
public class Test12 {
public static void main(String[] args){
print("abcd");
}
//接收一个字符串返回全字符组合情况
public static void print(String str){
//将字符串转化为字符数组
char[] ch = str.toCharArray();
//建立一个存有{"a","b","c"}的集合list1
ArrayList<String> list1 = new ArrayList<String>();
for(int i = 0; i < ch.length; i++){
list1.add(ch[i]+"");
}
for(int i = 0; i < ch.length; i++){
//取得每一行要输出的list集合
list1 = getList(list1, i+1,ch);
//遍历输出集合
for(String s:list1){
System.out.print("\"" + s + "\" ");
}
System.out.println("");
}
}
//取得每一行要输出的list集合
public static ArrayList<String> getList(ArrayList<String> list,int len,char[] ch){
//newList 用来装下一行要遍历的元素,list则代表上一行的元素集合
ArrayList<String> newList = new ArrayList<String>();
//该循环用来取得上一行的元素
for(String s:list){
String str = s;
for(int j = str.length();j < len ;j++){
//遍历字符串中没个元素
for(int i = 0; i < ch.length; i++){
//字符不重复则将Str+ch[i]添加进集合,
if(str.indexOf(ch[i]) == -1){
newList.add(str + ch[i]);
}
}
}
}
return newList.size() == 0 ? list:newList;
}
}
作者:
as604049322
时间:
2014-12-2 12:09
看着头疼,好难的样子~
作者:
l763631191
时间:
2014-12-2 14:48
:(好复杂
作者:
1017161726
时间:
2015-4-2 19:57
看题看的是思想
作者:
diqiulikai
时间:
2015-4-25 20:55
壹贰叁 发表于 2014-11-21 23:25
package com.itheima;
import java.awt.List;
"a" "b" "c"
"ab" "ac" "ba" "bc" "ca" "cb"
"abc" "acb" "bac" "bca" "cab" "cba"
运行结果不对啊
作者:
行意天下
时间:
2015-6-16 11:48
这个字符串的长度也不一定就是3啊,是任意长度的吧?
作者:
rhyhhg5
时间:
2015-8-25 15:55
看不太懂
作者:
牛德阳
时间:
2015-12-30 23:05
0小菜鸟0 发表于 2014-8-17 18:05
你这只能取三个字符的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2