回 帖 发 新 帖 刷新版面

主题:帮忙解释一下

这个程序实现字母的全排列,比如输入abc,输出为     abc,acb,bac,bca,cba,cab   ,有点不太明白,   

         static   List   arrange(String   s){   
  if   ((s==null)||(s.length()==0))   throw   new   IllegalArgumentException();   
  int   len=s.length();   
    
  List   list=new   ArrayList();   
  if(len==1)   {     
  list.add(s);     
  return   list;   
  }   
    
  char   c=s.charAt(0);   
  List   temp=arrange(s.substring(1));   
  StringBuffer   sb=new   StringBuffer(len);   
  for(int   i=0;i<temp.size();i++){   
  for(int   j=0;j<len;j++){   
  sb.setLength(0);   
  sb.append((String)temp.get(i));   
  sb.insert(j,c);   
  list.add(sb.toString());   
  }   
  }   
  return   list;   
  }

回复列表 (共4个回复)

沙发

这段代码用递归的确很难理解  你不妨从长度为2的字符串试试  只要理解了长度为2的就应该理解更长的字符串的运行顺序了:
假设传给该方法的字符串为ab,传进去后获得len=2;创建一个list,执行if后的语句,取得第一个字母c=a,执行到List   temp=arrange(s.substring(1));   这个语句调用原方法,赋给该方法的字符串为b,因为执行了s.substring(1) ,调用List   temp=arrange(s.substring(1)); 后下面的语句等待该语句完成后继续执行.将b传给arrange方法,b的长度为1肯定执行if 语句中的内容,将b添加到list中并返回给temp  这时候List   temp=arrange(s.substring(1)); 执行完毕  并获得temp的值为一个对象 b。
继续往下执行,创建一个StringBuffer  开始了for 语句的双重循环,这时候的temp的size肯定是1了 因为它里面只有一个b对象,而第二个for里的j<len中的len为2,因为这个len是取的字符串ab的长度。循环进行时把b从temp中取出追加到StringBuffer中,这时候StringBuffer中只有一个b,通过第二层的for循环把先前取的c=a,插入到StringBuffer中,得到一个排列后就加到list中  直到内层循环完成list中存放了这个字符串的全排列后返回list。(当j=0时  将a插到stringBuffer的0位置  得到ab  当j=1时将a插到StringBuffer的1位置 得到ba  )

板凳

晕 打了这么多字啊~~~累死了 还不一定能表达明白。。。。。还有不清楚的地方再提出来吧

3 楼

[quote]晕 打了这么多字啊~~~累死了 还不一定能表达明白。。。。。还有不清楚的地方再提出来吧[/quote]
  呵呵。。

4 楼

[quote][quote]晕 打了这么多字啊~~~累死了 还不一定能表达明白。。。。。还有不清楚的地方再提出来吧[/quote]
  呵呵。。[/quote]
   有些人,就是要你这么说。没办法。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册