A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.itheima.exam;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
import java.util.TreeSet;

/**
* 8、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符, 例如:原始字符串是"abc",
*  打印得到下列所有组合情况: "a" "b" "c"
* "ab" "bc" "ca" "ba" "cb" "ac" "abc" "acb" "bac" "bca" "cab" "cba"
*/
public class Test8
{

    public static void main(String[] args)
    {   
        //需要操作的字符串
        String str = "abcefgjt";
        //临时存放生成的元数
        List<String> con = new ArrayList<String>();
        //存放最终结果,用来去掉List集合中重复的元数
        Set<String> set = new TreeSet<String>();

        searchAndAdd(str, con);
        ListToSet(con, set);
    }
    //排列字符串组合
    private static void searchAndAdd(String str, List<String> con)
    {   
        //把原始的str分解,添加到list集合中
        if (con.size() == 0)
        {
            for (int i = 0; i < str.length(); i++)
            {
                con.add(str.substring(i, i + 1));
            }
        }
        //根据传入的字符串长度来控制循环次数
        for (int i = 0; i < str.length(); i++)
        {
              //用ListIterator来动态的操作集合中的元数
            ListIterator<String> lt = con.listIterator();
            //截取字符串中的一个字符串
            String st = str.substring(i, i + 1);
            //循环迭代集合
            while (lt.hasNext())
            {   
                //拿出集合中的一个元数
                String sb = lt.next();
                //判断集合中的一个元数是否包含字符串中取到的当前这个子字符串,
                //如果不包含就在这个元数的前后加上这个子字符串
                if (!sb.contains(st))
                {
                    lt.add(sb + st);
                    lt.add(st + sb);
                }

            }

        }
    }
    //去重复元数并迭代输出
    private static void ListToSet(List<String> con, Set<String> set)
    {   //把LIST中的元数添加到set集合中,这样能把重复的元数去掉
        for (String sb : con)
        {
            set.add(sb);
        }
        //迭代Set集合得到我们想要的结果
        for (String obj : set)
        {
            System.out.println(obj);
        }
    }
}


8 个回复

倒序浏览
这个题,,我也不会做
回复 使用道具 举报
闪耀.Q 发表于 2014-6-20 22:00
这个题,,我也不会做

我做10多个小时,很惨。。
回复 使用道具 举报
放入set去掉重复的,和我当时思路一样
回复 使用道具 举报
谢谢分享你的想法。明白了
回复 使用道具 举报
好高深的样子
回复 使用道具 举报
我来学习了网!!!!!!!!!!!!!!!!
回复 使用道具 举报
学习了。
回复 使用道具 举报
这个题思路可以是这样:
把字符串拆分到一个数组或者集合,首先是第一个开头排列,然后交换第一个和第二个排列一直到最后一个,然后用递归来一层一层排列,排列个数为那个字符串长度-1,然后排列长度-2一直到长度为等于2
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马