本帖最后由 Cool_xiaocao 于 2013-08-02 23:16:02 编辑

解决方案 »

  1.   

    按空格拆分成数组应该不用说啦,然后就是全排列了,不过你的全排列长度不是固定的,单个的或者没到最大长度的排列都算,所以有必要先看一下全排列, 这里。现在perm函数可以对任意长度的串进行全排,所以现在只要求出所有的不重复的组合类型再交给perm处理就可以了。
    假如一个串1234,对于长度位4的字串直接交给perm处理就可以了,小于它的则需要求出有多少种不重复的组合,所以现在需要求出长度为1,2,3的不重复组合:1,2,3,12,23,13,123,134,234。以此类推。然后就剩下通过递归去获取更中长度的串了。
    所以大概逻辑是:递归出不同长度的子串->遍历得到当前子串的不重复的子串->将子串进行全排列
      

  2.   


    function combine(str){
    var ss=str.split(' ');
    var a=[],i,j,m,L=ss.length;
    var re=[],_re,_L,k=0;
    for(i=0;i<L;i++)a.push([i]);
    re=re.concat(a);
    while(k<L-1){
    _re=[];
    for(i=0,_L=a.length-1;i<_L;i++){
     for(j=a[i][k]+1;j<L;j++){
      var _a=a[i].concat(j );
      _re.push( _a.slice(0));
      for(m=0;m<_a.length-1;m++ ){
        _a.push( _a.shift());
        re.push( _a.concat());
      }  
     }
    }
    a=_re.slice(0);
    re=re.concat(a);
    k++
    }
    console.info( re.length);
    return re.join('<br/>').replace(/,/g,' ').replace(/\d+/mg,function(v){return ss[v]});
    }document.write( combine('a b c d') );