我正在开发一个javascript项目,需要能够循环遍历模式的所有可能结果。
例如,我会说一个数字,然后从字符串" qwertyuiop"中独立挑选7个字符。我希望它以0qqqqqq
开头,然后前进到0qqqqqqw
然后0qqqqqqe
,依此类推。
答案 0 :(得分:0)
我在JS中为Algorithm for Combinations of given numbers with repetition? C++做了以前的工作。虽然原始算法是针对整数数组的,但我们也可以为字符串实现相同的算法。它使用动态编程方法。即使根据你想要的字符数量会有巨大的结果,这个应该尽可能快地完成工作。以下是n = 3
和输入字符串"qwerty"
的代码;而对于n = 7
,我们应该期望获得279936种组合的结果数组。我谦虚的AMD CPU垃圾在86921ms完成了这项工作。
function combosOfN(a,n){
var res = {};
a = a.split("");
for(var i = 1; i <= n; i++) res[i] = res[i-1] ? res[i-1].reduce((r,e) => r.concat(a.map(n => { var t = e.slice(0);
t.push(n);
return t;
})),[])
: a.map(e => [e]);
return res[n].map(e => "0"+e.join(""));
}
var str = "qwerty",
n = 3,
res = [];
console.time("test");
res = combosOfN(str,n);
console.timeEnd("test");
console.log(res);
&#13;
至于所有动态编程方法,我们从最小的解决方案开始,并朝着最终的结果前进。我们从空哈希开始。我们保持的哈希看起来如下,最后结果是第n项(它应该清楚地解释算法的逻辑)
{ '1': [ [ 'q' ], [ 'w' ], [ 'e' ], [ 'r' ], [ 't' ], [ 'y' ] ],
'2':
[ [ 'q', 'q' ],
[ 'q', 'w' ],
[ 'q', 'e' ],
[ 'q', 'r' ],
[ 'q', 't' ],
[ 'q', 'y' ],
[ 'w', 'q' ],
[ 'w', 'w' ],
[ 'w', 'e' ],
[ 'w', 'r' ],
[ 'w', 't' ],
[ 'w', 'y' ],
[ 'e', 'q' ],
[ 'e', 'w' ],
[ 'e', 'e' ],
[ 'e', 'r' ],
[ 'e', 't' ],
[ 'e', 'y' ],
[ 'r', 'q' ],
[ 'r', 'w' ],
[ 'r', 'e' ],
[ 'r', 'r' ],
[ 'r', 't' ],
[ 'r', 'y' ],
[ 't', 'q' ],
[ 't', 'w' ],
[ 't', 'e' ],
[ 't', 'r' ],
[ 't', 't' ],
[ 't', 'y' ],
[ 'y', 'q' ],
[ 'y', 'w' ],
[ 'y', 'e' ],
[ 'y', 'r' ],
[ 'y', 't' ],
[ 'y', 'y' ] ],
'3':
[ [ 'q', 'q', 'q' ],
[ 'q', 'q', 'w' ],
[ 'q', 'q', 'e' ],
[ 'q', 'q', 'r' ],
[ 'q', 'q', 't' ],
[ 'q', 'q', 'y' ],
[ 'q', 'w', 'q' ],
[ 'q', 'w', 'w' ],
[ 'q', 'w', 'e' ],
[ 'q', 'w', 'r' ],
[ 'q', 'w', 't' ],
[ 'q', 'w', 'y' ],
[ 'q', 'e', 'q' ],
[ 'q', 'e', 'w' ],
[ 'q', 'e', 'e' ],
[ 'q', 'e', 'r' ],
[ 'q', 'e', 't' ],
[ 'q', 'e', 'y' ],
[ 'q', 'r', 'q' ],
[ 'q', 'r', 'w' ],
[ 'q', 'r', 'e' ],
[ 'q', 'r', 'r' ],
[ 'q', 'r', 't' ],
[ 'q', 'r', 'y' ],
[ 'q', 't', 'q' ],
[ 'q', 't', 'w' ],
[ 'q', 't', 'e' ],
[ 'q', 't', 'r' ],
[ 'q', 't', 't' ],
[ 'q', 't', 'y' ],
[ 'q', 'y', 'q' ],
[ 'q', 'y', 'w' ],
[ 'q', 'y', 'e' ],
[ 'q', 'y', 'r' ],
[ 'q', 'y', 't' ],
[ 'q', 'y', 'y' ],
[ 'w', 'q', 'q' ],
[ 'w', 'q', 'w' ],
[ 'w', 'q', 'e' ],
[ 'w', 'q', 'r' ],
[ 'w', 'q', 't' ],
[ 'w', 'q', 'y' ],
[ 'w', 'w', 'q' ],
[ 'w', 'w', 'w' ],
[ 'w', 'w', 'e' ],
[ 'w', 'w', 'r' ],
[ 'w', 'w', 't' ],
[ 'w', 'w', 'y' ],
[ 'w', 'e', 'q' ],
[ 'w', 'e', 'w' ],
[ 'w', 'e', 'e' ],
[ 'w', 'e', 'r' ],
[ 'w', 'e', 't' ],
[ 'w', 'e', 'y' ],
[ 'w', 'r', 'q' ],
[ 'w', 'r', 'w' ],
[ 'w', 'r', 'e' ],
[ 'w', 'r', 'r' ],
[ 'w', 'r', 't' ],
[ 'w', 'r', 'y' ],
[ 'w', 't', 'q' ],
[ 'w', 't', 'w' ],
[ 'w', 't', 'e' ],
[ 'w', 't', 'r' ],
[ 'w', 't', 't' ],
[ 'w', 't', 'y' ],
[ 'w', 'y', 'q' ],
[ 'w', 'y', 'w' ],
[ 'w', 'y', 'e' ],
[ 'w', 'y', 'r' ],
[ 'w', 'y', 't' ],
[ 'w', 'y', 'y' ],
[ 'e', 'q', 'q' ],
[ 'e', 'q', 'w' ],
[ 'e', 'q', 'e' ],
[ 'e', 'q', 'r' ],
[ 'e', 'q', 't' ],
[ 'e', 'q', 'y' ],
[ 'e', 'w', 'q' ],
[ 'e', 'w', 'w' ],
[ 'e', 'w', 'e' ],
[ 'e', 'w', 'r' ],
[ 'e', 'w', 't' ],
[ 'e', 'w', 'y' ],
[ 'e', 'e', 'q' ],
[ 'e', 'e', 'w' ],
[ 'e', 'e', 'e' ],
[ 'e', 'e', 'r' ],
[ 'e', 'e', 't' ],
[ 'e', 'e', 'y' ],
[ 'e', 'r', 'q' ],
[ 'e', 'r', 'w' ],
[ 'e', 'r', 'e' ],
[ 'e', 'r', 'r' ],
[ 'e', 'r', 't' ],
[ 'e', 'r', 'y' ],
[ 'e', 't', 'q' ],
[ 'e', 't', 'w' ],
[ 'e', 't', 'e' ],
[ 'e', 't', 'r' ],
[ 'e', 't', 't' ],
[ 'e', 't', 'y' ],
[ 'e', 'y', 'q' ],
[ 'e', 'y', 'w' ],
[ 'e', 'y', 'e' ],
[ 'e', 'y', 'r' ],
[ 'e', 'y', 't' ],
[ 'e', 'y', 'y' ],
[ 'r', 'q', 'q' ],
[ 'r', 'q', 'w' ],
[ 'r', 'q', 'e' ],
[ 'r', 'q', 'r' ],
[ 'r', 'q', 't' ],
[ 'r', 'q', 'y' ],
[ 'r', 'w', 'q' ],
[ 'r', 'w', 'w' ],
[ 'r', 'w', 'e' ],
[ 'r', 'w', 'r' ],
[ 'r', 'w', 't' ],
[ 'r', 'w', 'y' ],
[ 'r', 'e', 'q' ],
[ 'r', 'e', 'w' ],
[ 'r', 'e', 'e' ],
[ 'r', 'e', 'r' ],
[ 'r', 'e', 't' ],
[ 'r', 'e', 'y' ],
[ 'r', 'r', 'q' ],
[ 'r', 'r', 'w' ],
[ 'r', 'r', 'e' ],
[ 'r', 'r', 'r' ],
[ 'r', 'r', 't' ],
[ 'r', 'r', 'y' ],
[ 'r', 't', 'q' ],
[ 'r', 't', 'w' ],
[ 'r', 't', 'e' ],
[ 'r', 't', 'r' ],
[ 'r', 't', 't' ],
[ 'r', 't', 'y' ],
[ 'r', 'y', 'q' ],
[ 'r', 'y', 'w' ],
[ 'r', 'y', 'e' ],
[ 'r', 'y', 'r' ],
[ 'r', 'y', 't' ],
[ 'r', 'y', 'y' ],
[ 't', 'q', 'q' ],
[ 't', 'q', 'w' ],
[ 't', 'q', 'e' ],
[ 't', 'q', 'r' ],
[ 't', 'q', 't' ],
[ 't', 'q', 'y' ],
[ 't', 'w', 'q' ],
[ 't', 'w', 'w' ],
[ 't', 'w', 'e' ],
[ 't', 'w', 'r' ],
[ 't', 'w', 't' ],
[ 't', 'w', 'y' ],
[ 't', 'e', 'q' ],
[ 't', 'e', 'w' ],
[ 't', 'e', 'e' ],
[ 't', 'e', 'r' ],
[ 't', 'e', 't' ],
[ 't', 'e', 'y' ],
[ 't', 'r', 'q' ],
[ 't', 'r', 'w' ],
[ 't', 'r', 'e' ],
[ 't', 'r', 'r' ],
[ 't', 'r', 't' ],
[ 't', 'r', 'y' ],
[ 't', 't', 'q' ],
[ 't', 't', 'w' ],
[ 't', 't', 'e' ],
[ 't', 't', 'r' ],
[ 't', 't', 't' ],
[ 't', 't', 'y' ],
[ 't', 'y', 'q' ],
[ 't', 'y', 'w' ],
[ 't', 'y', 'e' ],
[ 't', 'y', 'r' ],
[ 't', 'y', 't' ],
[ 't', 'y', 'y' ],
[ 'y', 'q', 'q' ],
[ 'y', 'q', 'w' ],
[ 'y', 'q', 'e' ],
[ 'y', 'q', 'r' ],
[ 'y', 'q', 't' ],
[ 'y', 'q', 'y' ],
[ 'y', 'w', 'q' ],
[ 'y', 'w', 'w' ],
[ 'y', 'w', 'e' ],
[ 'y', 'w', 'r' ],
[ 'y', 'w', 't' ],
[ 'y', 'w', 'y' ],
[ 'y', 'e', 'q' ],
[ 'y', 'e', 'w' ],
[ 'y', 'e', 'e' ],
[ 'y', 'e', 'r' ],
[ 'y', 'e', 't' ],
[ 'y', 'e', 'y' ],
[ 'y', 'r', 'q' ],
[ 'y', 'r', 'w' ],
[ 'y', 'r', 'e' ],
[ 'y', 'r', 'r' ],
[ 'y', 'r', 't' ],
[ 'y', 'r', 'y' ],
[ 'y', 't', 'q' ],
[ 'y', 't', 'w' ],
[ 'y', 't', 'e' ],
[ 'y', 't', 'r' ],
[ 'y', 't', 't' ],
[ 'y', 't', 'y' ],
[ 'y', 'y', 'q' ],
[ 'y', 'y', 'w' ],
[ 'y', 'y', 'e' ],
[ 'y', 'y', 'r' ],
[ 'y', 'y', 't' ],
[ 'y', 'y', 'y' ] ] }