黑马程序员技术交流社区
标题:
【字符串的全字符组合】,大家来讨论,谁的方法吊炸天
[打印本页]
作者:
黑马晓志
时间:
2014-2-22 21:59
标题:
【字符串的全字符组合】,大家来讨论,谁的方法吊炸天
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符例如:原始字符串是"abc",打印得到下列所有组合情况"a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac""abc" "acb" "bac" "bca" "cab" "cba"
一开始没思路,苦思冥想一天,脑袋顿开,可以把它想象成数学中的(a+b+c)(a+b+c),下面是我的代码,你有不同的方法吗?
package com.itheima;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class Test7 {
public static void main(String[] args) {
String string="abcd";
//将字符串转换成字符数组,再将字符数组,转化成只有一个字符组成的字符串的字符串数组,转化结果是这种形式{"a","b","c","d"}
char[]chars=string.toCharArray();
String[] strings =new String[chars.length];
for(int i=0;i<chars.length;i++){
strings[i]=chars[i]+"";
}
// 空list
List<String> oldList = new ArrayList<String>();
List<String> newList = new ArrayList<String>();
for (int i = 0; i < strings.length; i++) {
// 装入newList,清空oldList
for (int j = 0; j < strings.length; j++) {
if (oldList.size() != 0) {
for (String str : oldList) {
//判断字符串是否含有相同字符
if (method(strings, strings[j] + str)) {
newList.add(strings[j] + str);
System.out.print(strings[j] + str + " ");
}
}
} else {
newList.add(strings[j]);
System.out.print(strings[j] + " ");
}
}
System.out.println();
oldList.clear();
// 装入oldList,清空newList
for (String str : newList) {
oldList.add(str);
}
newList.clear();
}
}
//定义一个判断字符串中是否有重复的制定的字符的方法
private static boolean method(String[] strings, String str) {
for (int i = 0; i < strings.length; i++) {
int num = 0;
char c[] = str.toCharArray();
for (int j = 0; j < c.length; j++) {
if ((c[j] + "") .equals(strings[i]))
num++;
}
if (num > 1)
return false;
}
return true;
}
}
复制代码
作者:
flying
时间:
2014-2-23 02:08
public class A {
public static void main(String[] args) throws Exception{
//读入字符
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
String line =null;
while((line=bufr.readLine())!=null){
List<String> list = new ArrayList<String>();
addToList(line,list);
List<String>list1 =fun(list);//得到字符串的所有组合
for(int i=1;i<=list.size();i++){
show(list1,i);
}
}
}
public static void addToList(String line, List<String> list) {
for(int i=0;i<line.length();i++){
list.add(line.substring(i,i+1));
}
}
public static void show(List<String>list,int num){
HashSet<String> hs = new HashSet<String>();
for(String str:list){
hs.add(str.substring(0,num));
}
for(String str:hs){
System.out.print(str+" ");
}
System.out.println();
}
public static List<String> fun(List<String> list){
List<String> list1 = new ArrayList<String>();
if(list.size()==1)
return list;
else{
for (int i = 0; i < list.size(); i++) {
List<String> listbuf=copyList(list);
StringBuilder s =null;
listbuf.remove(i);
List<String> list2 =fun(listbuf);
for(int j=0;j<list2.size();j++){
s=new StringBuilder();
s.append(list.get(i)+list2.get(j));
list1.add(s.toString());
}
}
return list1;
}
}
public static List<String>copyList(List<String> list){
List<String> list1 =new ArrayList<String>();
for(String s:list){
list1.add(s);
}
return list1;
}
}
复制代码
作者:
lachening
时间:
2014-3-4 01:44
本帖最后由 lachening 于 2014-3-4 01:52 编辑
纠结了好久,才想好在嵌套for循环和递归两者中到底要用哪种方法。
感觉这道题在基础测试题中应该算是有点难度的题,搞了好久才写出来。。。
package com.itheima;
import java.util.*;
public class Test5 {
static List<String> all = new ArrayList<String>(); //用于存放全部组合字符串。
static Iterator<String> iter; //操作List的迭代器。
private static void per(StringBuffer strb, StringBuffer s) {
//核心函数,递归方式实现字符排列组合并注入List
StringBuffer tmp = new StringBuffer();
StringBuffer tmp_s = new StringBuffer(); //用于保护实参的临时变量
if (strb.length() != 0) { //若已有串strb不是空串,直接注入List
tmp.append(strb);
all.add(new String(tmp.substring(0)));
}
if (s.length() == 1) { //若剩余串s中只包含一个字符
tmp.append(s.charAt(0)); //则将s中唯一的字符append入tmp后注入List
all.add(new String(tmp.substring(0)));
} else { //若剩余串s中字符数大于1,则取出其中之一加入已有串,连同
for(int i=0; i<s.length(); i++ ) { //取后剩下的串作为参数传入该函数,递归调用。
tmp.replace(0, tmp.length(), strb.substring(0)); //保护实参
tmp_s.replace(0, tmp_s.length(), s.substring(0)); //保护实参
Test5.per(tmp.append(s.charAt(i)), tmp_s.deleteCharAt(i));
}
}
}
private static void fun(String string) { //字符串预处理及结果打印函数
StringBuffer test = new StringBuffer(string); //将输入的字符串转换成StingBuffer类型
Test5.per(new StringBuffer(), test);
for(int i=0; i<string.length(); i++) { //每次循环,都只输出包含i个字符的串
iter = all.iterator();
while (iter.hasNext()) {
String tmp = iter.next();
if (tmp.length() == i + 1) {
System.out.print("\"" + tmp + "\"" + " ");
}
}
System.out.print("\n"); //输出一组后进行换行
}
}
public static void main(String[] args) {
String testString = "abc";
Test5.fun(testString);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2