黑马程序员技术交流社区

标题: 打印一个字符串的所有排列形式 [打印本页]

作者: 爱学习的小明    时间: 2014-11-11 19:35
标题: 打印一个字符串的所有排列形式
怎么用代码实现任意一个字符串的所有排列形式?如将“abcd”所有的字符串的排列打印出来,
"a" ,“b”,“c”
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
我自己写的代码是:
class Test
        {
        public static void main(String[] args)       
        {
                String [] arr ={"a","b","c"};
                for (int x=0;x<3 ;x++ )
                {
                        for (int y = 0;y<3 ;y++ )
                        {
                                for (int z = 0;z<3 ;z++ )
                                {
                                        if(x==y && x==z)
                                                System.out.println(arr[z]);
                                        if(x!=y && y==z)
                                                System.out.println(arr[x]+arr[y]);
                                        if(x!=y && y!=z && x!=z)
                                                System.out.println(arr[x]+arr[y]+arr[z]);
                                }
                        }
                }
        }
}
但这只是实现了abc三个字母的排序,如果是4个字母,那再加一个循环,加多几次判断语句,觉的这种思想
不理想,请教各位同学,有没有更好的思路实现任意长度字符串的排序。
作者: hanxing    时间: 2014-11-12 23:15
给你两个方法,一个是获取所有子字符串,如果需要去重可以把list改成set,这两个方法都是通用的,只不过是在其它文件中截取出来的
  1. //求一个字符串的所有字字符串
  2.         public static List<String> getSubStrList(String str) {
  3.                 List<String> list = new ArrayList<String>();
  4.                 for (int i = 0; i < str.length(); i++) {
  5.                         for (int j = i + 1; j < (str.length() + 1); j++) {
  6.                                 String subStr = str.substring(i, j);

  7.                                 list.add(subStr);

  8.                         }
  9.                 }
  10.                 System.out.println("List"+list);
  11.                 return list;
  12.         }
复制代码
下面这个是对字符串进行排序的,当然,你也可以用另一种方法Comparator对象实现定制排序,还有一个叫Collections工具类中有个sort()方法我没试过,你可以试试.
  1.         //利用选择原理对list中的元素进行排序
  2.                 for (int i = 0; i < list.size() - 1; i++) {
  3.                         for (int j = i; j < list.size(); j++) {
  4.                                 String str1 = list.get(i);
  5.                                 String str2 = list.get(j);
  6.                                 String mark = null;
  7.                                 //分别把字符串变为小写字符,并比较大小,如果前面的小于后面的字符串,就调换list中对应的value
  8.                                 if ((str1.toLowerCase()).compareTo(str2.toLowerCase()) < 0) {
  9.                                         mark = str1;//用于存放 list中index为i的value
  10.                                         list.set(i, str2);//把大的字符串的value覆盖index为i的value
  11.                                         list.set(j, mark);//把index为i的value覆盖index为j的value
  12.                                 }
  13.                         }

  14.                 }
复制代码









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2