本帖最后由 奋斗小青年 于 2015-2-28 10:52 编辑
7.编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
我写的时候考虑的是 1.每行字符个数都是递增 2.下一行的字符是建立在上一行的基础上得到的 ,所以在第一行的基础上一次获取第二行第三行...
每行获取之后需要与给定的字符串进行组合,排除重复,然后存储到新集合中,返回新集合即可。
我的代码如下:
- import java.util.*;
- class Test7 {
-
- public static void main(String[] args)
- {
- //调用获取子串的方法
- getSubString("abcd");
- }
-
- //用于获取所有可能子串的方法
- public static void getSubString(String str)
- {
- //将字符串转成字符数组
- char[] ch = str.toCharArray();
-
- //创建一个List集合用于存放字符串集合
- ArrayList<String> arr = new ArrayList<String>();
-
- //将{a,b,c}先行存入到集合中用于第二,第三行获取
- for(int x=0;x<ch.length;x++)
- {
- arr.add(ch[x]+"");
- }
-
- //有多少字符就有多少行,循环获取每行子串
- for(int x=0;x<str.length();x++)
- {
- //调用getList方法获取每行的子串可能,注意第一行判断
- if(x!=0)
- arr = getList(arr,ch);
-
- //利用高级for循环获取集合中元素,也可以用迭代器获取
- for(String s:arr)
- {
- System.out.print("\"" + s + "\" ");
- }
- System.out.println();
- }
- }
-
- //获取子串可能性的方法
- public static ArrayList<String> getList(ArrayList<String> arr,char[] ch)
- {
- //新建一个新的集合用于存放新的一行用于返回
- ArrayList<String> newarr = new ArrayList<String>();
-
- //对上一行元素进行循环,来得到新的不重复的子串
- for(String s:arr)
- {
- String str = s;
- //对字符数组中元素进行遍历,如果当前字符串中不含有该元素就将str+ch[i]加入到新的集合中
- for(int i=0;i<ch.length;i++)
- {
- if(str.indexOf(ch[i]) == -1)
- {
- newarr.add(str + ch[i]);
- }
- }
-
- }
- //返回新的集合
- return newarr;
- }
- }
复制代码
写完之后看到论坛上有前辈给出的写法是在元素组合部分采用了两重循环同时getList带的参数也多一个,我个人觉得那个循环多余,只需要获取上一行元素对应的List,再用List中元素组合ch中字符就能得到新的一行的List,所以觉得他写的是多余的,我验证结果是相同的,但是也不懂为什么他的也能行,有没有大神能分辨一下?
他的代码如下:
- //取得每一行要输出的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;
- }
复制代码
|
|