黑马程序员技术交流社区

标题: 字符串全排列(想用递归,但不会写) [打印本页]

作者: 小悟空et    时间: 2015-5-21 10:48
提示: 该帖被管理员或版主屏蔽
作者: yas丶    时间: 2015-5-21 14:19
学习下~~!
作者: as604049322    时间: 2015-5-21 14:56
曾经把我虐哭的题,,,:'(:'(


  1. /*
  2. 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
  3. 例如:
  4. 原始字符串是"abc",打印得到下列所有组合情况
  5. "a" "b" "c"
  6. "ab" "bc" "ca" "ba" "cb" "ac"
  7. "abc" "acb" "bac" "bca" "cab" "cba"*/

  8. import java.util.*;
  9. class PermComStr{
  10.     public static void main(String[] args){
  11.             List<String> list=combinations("abc",true);
  12.             System.out.println(list);
  13.            
  14.     }
  15.     /*思路分析:
  16.     每行字符个数都是递增 ,下一行的字符是建立在上一行的基础上得到的
  17.     即在将第一行字符串长度限定为1,第二行为2....,在第一行数据基础上{a,b,c},创建第二行数据,遍历字符串中所字符,并与第一行数据组合。注意每行字符串长度限制
  18.     1、先将原始字符串转换成字符数组ch
  19.     2、将原始字符串每个字符添加到Arraylist<String> list集合中
  20.     3、遍历list集合用每个元素str去查找是否存在数组ch中的元素,如果ch中的字符c没有被str找到则用str+c作为新集合的值返回;
  21.     4、遍历新集合重复3步骤
  22.     */
  23.     public static List<String> combinations(String str,int num) {
  24.             List<String> list=new ArrayList<String>();
  25.             char[] ch=str.toCharArray();
  26.             if(num>ch.length)
  27.                     num=ch.length;
  28.             for(int i=0;i<num;i++){
  29.                     list=getList(list, ch);
  30.             }
  31.             return list;
  32.     }
  33.     public static List<String> combinations(String str) {
  34.             return combinations(str,str.length());
  35.     }
  36.     public static List<String> combinations(String str,boolean all) {
  37.             List<String> result=new ArrayList<String>();
  38.             List<String> temp=new ArrayList<String>();
  39.             char[] ch=str.toCharArray();
  40.             for(int i=0;i<ch.length;i++){
  41.                     temp=getList(temp, ch);
  42.                     result.addAll(temp);
  43.             }
  44.             return result;
  45.     }
  46.    
  47.         public static List<String> getList(List<String> list, char[] ch) {
  48.                 if(list.size()==0){
  49.                         for(char c:ch)
  50.                                 list.add(c+"");
  51.                         return list;
  52.                 }
  53.                 List<String> newList=new ArrayList<String>();
  54.                 for(String str:list)
  55.                         for(char c:ch)
  56.                                 if(str.indexOf(c)==-1)
  57.                                         newList.add(str+c);
  58.                 return newList;
  59.         }

  60. }


复制代码

作者: 王建伟    时间: 2015-5-21 15:02
??????
作者: 小悟空et    时间: 2015-5-21 15:12
王建伟 发表于 2015-5-21 15:02
??????

说我不能出现基础测试。。。
作者: 王建伟    时间: 2015-5-21 15:16
本帖最后由 王建伟 于 2015-5-21 15:30 编辑
小悟空et 发表于 2015-5-21 15:12
说我不能出现基础测试。。。

好吧,你进我的主题里面看吧,我的基础测试也有这个题目,我用递归写的,当时我也是捣鼓了将近两天。。。。注释的也比较清晰。。。。希望对你有帮助。
作者: 大可乐    时间: 2015-5-21 15:17
、、、、、、解答啊
作者: 小悟空et    时间: 2015-5-21 15:33
as604049322 发表于 2015-5-21 14:56
曾经把我虐哭的题,,,

谢谢谢谢,我看一下。大概有那么点感觉,我得好好研究下思路,等会自己写写看。
这题想思路就很虐心
作者: 小悟空et    时间: 2015-5-21 15:35
王建伟 发表于 2015-5-21 15:16
好吧,你进我的主题里面看吧,我的基础测试也有这个题目,我用递归写的,当时我也是捣鼓了将近两天。。。 ...

恩恩。好好。我研究一下。递归用着真是开始不好想明白
作者: 王建伟    时间: 2015-5-21 15:40
小悟空et 发表于 2015-5-21 15:35
恩恩。好好。我研究一下。递归用着真是开始不好想明白

最麻烦的是不让陷入死循环那点的控制,我当时用递归陷入死循环了,贴出来问也没有人解答我,我就自己捣鼓出来了。你看看吧
作者: 王建伟    时间: 2015-5-21 15:44
王建伟 发表于 2015-5-21 15:40
最麻烦的是不让陷入死循环那点的控制,我当时用递归陷入死循环了,贴出来问也没有人解答我,我就自己捣鼓 ...

不过我自己想的也可能有误区,你要是参考着想出更好的了,告诉我一下解决方案




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