黑马程序员技术交流社区
标题:
Java的大神们 帮忙看看这道题咋做呀
[打印本页]
作者:
宋文辉
时间:
2014-6-21 23:23
标题:
Java的大神们 帮忙看看这道题咋做呀
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,
例如:原始字符串是"abc",
打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
作者:
宋文辉
时间:
2014-6-21 23:24
最好带注释的 ,谢谢了
作者:
苏周周
时间:
2014-6-22 00:49
用的是递归
import java.util.Scanner;
import java.util.TreeSet;
public class Test07 {
public static void main(String[] args) {
// 定义一个键盘输入
System.out.println("输入一个字符串:");
Scanner sc = new Scanner(System.in);
String string = sc.next();
System.out.println(string);
sc.close();
show(string);
}
// 打印字符串的所有可能的组合
private static void show(String str) {
TreeSet<String> set = saveInSet(new StringBuilder(str), 0,
new StringBuilder(), new TreeSet<String>());
for (String s : set) {
System.out.println(s);
}
}
/**
* 返回集合,集合包含字符串所有字符的可能组合
*
* @param str
* 给定字符串转换成的StringBuilder对象,主要是为了操作字符方便
* @param count
* 计数,对第count进行排列组合
* @param buff
* 暂存放某种可能
* @param set
* 集合,去除重复元素,例如"aab"以第一个a开头会有aba,以第二个a开头也会有aba
* @return 返回TreeSet集合
*/
private static TreeSet<String> saveInSet(StringBuilder str, int count,
StringBuilder buff, TreeSet<String> set) {
for (int x = 0, len = str.length(); x < len; x++) {
// 获取字符
char ch = str.charAt(x);
// 去掉原字符串的某个字符(保证某个字符不被重复利用)
str.deleteCharAt(x);
// 缓存添加该字符
buff.append(ch);
// 将该种可能组合存入集合
set.add(buff.toString());
// str仍包含字符,则递归调用,开始取第二位字符
// 若还有第三位则继续递归……以此类推
if (str.length() != 0) {
// count用于记录目前在进行排列组合的第count位
count++;
// 递归
saveInSet(str, count, buff, set);
// 第n位递归结束后,需要继续对n-1位排列,位数-1
count--;
}
// 递归结束后,需要继续对n-1位排列,因此清除第n位的记录
buff.deleteCharAt(count);
// 删除的字符插回str
str.insert(x, ch);
}
// 返回集合
return set;
}
}
作者:
王小磊xiaolei
时间:
2014-6-22 01:38
package com.itheima;
public class test {
public static void main(String[] args) {
String str ="abcd";
//将字符串转为字符数组
char[] cs =str.toCharArray();
String[] strs=new String[cs.length];
for(int i=0;i<cs.length;i++){
strs[i]=new Character(cs[i]).toString() ;
System.out.print(strs[i]+" ");
}
System.out.println("\t");
String[] newStrs = combination(strs,strs);
for(int i =0;i<str.length()-2;i++){
newStrs = combination(strs,newStrs);
}
}
public static String[] combination(String[] s1,String[] s2){
String[] strs = new String[s1.length*s2.length];
int len = 0;
for(int i=0;i<s1.length;i++){
for(int j=0;j<s2.length;j++){
if(s2[j].indexOf(s1[i])==-1){
System.out.print(s1[i]+s2[j]+" ");
strs[len]=s1[i]+s2[j];
len++;
}
}
}
System.out.println("\t");
String[] newStrs = new String[len];
for(int i=0;i<len;i++){
newStrs[i]=strs[i];
}
return newStrs;
}
}
作者:
hm1314
时间:
2014-6-23 08:42
楼上正解。
作者:
王江涛
时间:
2014-6-23 09:08
苏周周 发表于 2014-6-22 00:49
用的是递归
我看过第10期的论坛,也有人提问类似的 问题,但很少有人答出来
作者:
初升的晨曦
时间:
2014-6-23 10:29
这道题是哪里来的?
作者:
任黎明
时间:
2014-6-23 21:54
我来学习了!~~~~~~~~~
作者:
Silvester
时间:
2014-6-28 21:23
辉辉啊辉辉,其实我也没做出来!
作者:
王小磊xiaolei
时间:
2014-6-29 23:39
hm1314 发表于 2014-6-23 08:42
楼上正解。
虽然解决,但是做法明显太烂:'(
作者:
Leung
时间:
2014-6-30 07:55
这都不会。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2