我有一个近2700个字符串的数组,我需要找到一个句子anagram的正确短语。该列表是一个排序列表,几乎有100k项长的单词列表。
我希望将它们合并为1,2和2。如果它们符合我的字谜长度,则会将3个单词组合在一起并匹配单词的长度,并修剪为空格。
我试过这个功能,但它在内存上失败了,我可以将最多3个单词放在一起以匹配:
var permutations = require('./permutations.js').permutations;
var shortList = words.slice(10, 20);
var result = permutations(shortList);
console.log(result);
和permutation.js中的这个
(function (exports) {
'use strict';
var permutations = (function () {
var res;
function swap(arr, i, j) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function permutations(arr, current) {
if (current >= arr.length) {
return res.push(arr.slice());
}
for (var i = current; i < arr.length; i += 1) {
swap(arr, i, current);
permutations(arr, current + 1);
swap(arr, i, current);
}
}
return function (arr) {
res = [];
permutations(arr, 0);
var temp = res;
// Free the extra memory
res = null;
return temp;
};
}());
exports.permutations = permutations;
}((typeof window === 'undefined') ? module.exports : window));
编辑:
实施例
var input = ['test', 'foo', 'bar', 'hello', 'world'];
var output = magicFunc(input);
// console.log(output);
//
// [['test foo bar'],
// ['test foo hello'],
// ['test foo world'],
// ['test bar foo'],
// ['test bar hello'],
// ['test bar world']...];
答案 0 :(得分:1)
3个单词的所有排列都是3个! = 6
100,000字的选择3的所有组合是100000! / 6(99,996!)〜= 1.66e14
所以你的最终输出是1.66e14 * 6~ = 9.99e14
尝试创建1千万亿字符串数组的列表比计算机可以处理的更多。
我试过这个功能,但内存失败
轻描淡写
您必须在单词列表上进行一些预处理。按照它们包含的字母和长度对它们进行分区。然后对你的字谜进行更集中的搜索。
最后,不要为此使用递归(它没有必要,因为为每次调用创建了堆栈帧,所以它会更快用完。
只需使用for循环三次我循环你就可以得到每一个结果 - Daniel Cheung
for(var i = 0; i < list.length; i++) {
var wi = list[i];
for(var j = i + 1; j < list.length; j++) {
var wj = list[j];
for(var k = j + 1; k < list.length; k++) {
var wk = list[k];
// hard coded 6 permutations
var p1 = wi + wj + wk;
var p2 = wi + wk + wj;
var p3 = wj + wi + wk;
var p4 = wj + wk + wi;
var p5 = wk + wi + wj;
var p6 = wk + wj + wi;
// check p1 - p6 for your anagram condition
...
}
}
}
答案 1 :(得分:0)
排列不重复,长度为3:
var input = ['test', 'foo', 'bar', 'hello', 'world'],
output = input.reduce(function (r, a, i) {
input.forEach(function (b, j) {
i !== j && input.forEach(function (c, k) {
i !== k && j !== k && r.push([a, b, c]);
});
});
return r;
}, []);
document.write('<pre>' + JSON.stringify(output, null, 4) + '</pre>');
&#13;