<script type=text/javascript>
String.prototype.Pusharr = function() {
       var K = {}, R = []; 
       var A = this.split(""), M = A.length;
       while (R.length < M) {
              var Q = M * Math.random() >> 0;
              ! K[Q] && R.push(A[Q]) && (K[Q] = !0);
       }
       try {return R.join("")} finally {R.length = 0}
}
String.prototype.Arrange = function() {     
       var I = J = 0, K = {}, R = [], A = this.split(""), M = A.length;
       var O = A.join("‖").match(/(\b[^‖]+\b)(?!.*‖\1\b)/gi).length;
       var X = function(i){return i > 0 ? arguments.callee(i - 1) * i : 1}(O);
       while (I ++ < M) {
              ! K[A[I]] && (K[A[I]] = !0) || J ++;
       }
       var N = X + J;
       while (R.length < N) {
              var Q = this.Pusharr();
              ! K[Q] && R.push(Q) && (K[Q] = !0);
       }
       return R
}
alert("abb".Arrange());
alert("abc".Arrange());
alert("abbbb".Arrange());
alert("abbde".Arrange());
alert("abcde".Arrange());
</script>

解决方案 »

  1.   

    简化:<script type=text/javascript>
    String.prototype.Pusharr = function() {
           var K = {}, R = []; 
           var A = this.split(""), M = A.length;
           while (R.length < M) {
                  var Q = M * Math.random() >> 0;
                  ! K[Q] && R.push(A[Q]) && (K[Q] = !0);
           }
           try {return R.join("")} finally {R.length = 0}
    }
    String.prototype.Arrange = function() {     
           var I = 0, K = {}, R = [], A = this.split(""), M = A.length;
           var O = A.join("‖").match(/(\b[^‖]+\b)(?!.*‖\1\b)/gi).length;
           var X = function(i){return i > 0 ? arguments.callee(i - 1) * i : 1}(O);
           var N = X + M - O;
           while (R.length < N) {
                  var Q = this.Pusharr();
                  ! K[Q] && R.push(Q) && (K[Q] = !0);
           }
           return R
    }
    alert("abb".Arrange());
    alert("abc".Arrange());
    alert("abbbb".Arrange());
    alert("abbde".Arrange());
    alert("abcde".Arrange());
    </script>
      

  2.   


    <script type=text/javascript>
    String.prototype.Pusharr = function() {
           var K = {}, R = []; 
           var A = this.split(""), M = A.length;
           while (R.length < M) {
                  var Q = M * Math.random() >> 0;
                  ! K[Q] && R.push(A[Q]) && (K[Q] = !0);
           }
           return R.join("")
    }
    String.prototype.Arrange = function() {     
           var I = 0, K = {}, R = [], A = this.split(""), M = A.length;
           var O = A.join("‖").match(/(\b[^‖]+\b)(?!.*‖\1\b)/gi).length;
           var X = function(i){return i > 0 ? arguments.callee(i - 1) * i : 1}(O);
           var N = X + M - O;
           while (R.length < N) {
                  var Q = this.Pusharr();
                  ! K[Q] && R.push(Q) && (K[Q] = !0);
           }
           return R.join(",")
    }
    alert("abb".Arrange());
    alert("abc".Arrange());
    alert("abbb".Arrange());
    alert("abcd".Arrange());
    alert("abbbb".Arrange());
    alert("abbde".Arrange());
    alert("abcde".Arrange());
    </script>
      

  3.   

    还不好,如果输入单词“aaa”就出问题了。昨晚上想完善但回帖不能连续3次,刚看到连续已打断就补上来。<script type=text/javascript>
    String.prototype.Pusharr = function() {
           var K = {}, R = []; 
           var A = this.split(""), M = A.length;
           while (R.length < M) {
                  var Q = M * Math.random() >> 0;
                  ! K[Q] && R.push(A[Q]) && (K[Q] = !0);
           }
           return R.join("")
    }
    String.prototype.Arrange = function() {     
           var I = 0, K = {}, R = [], A = this.split(""), M = A.length;
           var O = A.join("‖").match(/(\b[^‖]+\b)(?!.*‖\1\b)/gi).length;
           var X = function(i){return i > 0 ? arguments.callee(i - 1) * i : 1}(O);
           var N = O > 1 ? X + M - O : 1;
           while (R.length < N) {
                  var Q = this.Pusharr();
                  ! K[Q] && R.push(Q) && (K[Q] = !0);
           }
           return R.join(",")
    }
    alert("aaa".Arrange());
    alert("abb".Arrange());
    alert("abc".Arrange());
    alert("abbb".Arrange());
    alert("abcd".Arrange());
    alert("abbbb".Arrange());
    alert("abbde".Arrange());
    alert("abcde".Arrange());
    </script>
      

  4.   

    提示这行错误 :var O = A.join("‖").match(/(\b[^‖]+\b)(?!.*‖\1\b)/gi).length;
    "未结束的字符串常量"
      

  5.   


    哦,可能编码问题,中间有特殊字符“‖”,我贴的是UTF-8。再简化并改编码为编码为ANSI贴如下。效率怎么提高呢?下面还只到7个不同字母组成的单词全排5040种组合,就较慢了。
    <script type=text/javascript>String.prototype.Arrange = function() {     
           var Q = I = 0, K = {}, R = [], A = this.split(""), M = A.length;
           var O = A.join("‖").match(/(\b[^‖]+\b)(?!.*‖\1\b)/gi).length;
           var X = function(i){return i > 0 ? arguments.callee(i - 1) * i : 1}(O);
           var N = O > 1 ? X + M - O : 1;
           while (R.length < N) {
                  Q = A.sort(function(){return Math.random() > .5 ? 1 : -1}).join("");
                  ! K[Q] && R.push(Q) && (K[Q] = !0);
           }
           return R.join("\n")
    }alert("a".Arrange());
    alert("aaa".Arrange());
    alert("abb".Arrange());
    alert("abc".Arrange());
    alert("abbb".Arrange());
    alert("abcd".Arrange());
    alert("abbbb".Arrange());
    alert("abbde".Arrange());
    alert("abcdefg".Arrange());</script>