function* permutation(s) {
if (s.length < 3) {
yield s;
if (s.length == 2) yield s[1] + s[0];
} else {
for (let i = 0; i < s.length; i++) {
let h = s[i];
for (let t of permutation(s.substr(0, i) +
s.substr(i + 1))) yield h + t;
}
}
}
function* spread(s, i, cnt) {
for (; i < s.length; i++) {
let c = s[i];
if (cnt[c] > 1) {
let cn = Object.assign({}, cnt);
cn[c]--;
i++;
for (let j = i; j <= s.length; j++) {
for (let t of spread(s.substr(0, j)
+ c + s.substr(j), i, cn)) yield t;
}
return
}
}
yield s;
}
function* permUniq(s) {
let cnt = {};
for (let c of s) cnt[c] = (cnt[c] || 0) + 1;
for (let t of permutation(''.concat(...new Set(s)))) {
for (let u of spread(t, 0, cnt)) {
yield u
}
}
}
for (let s of ["aaa", "aab", "abc", "aabb",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]) {
for (let t of permUniq(s)) console.log(t);
console.log("~~~~");
}
Эта задачка геморройная, переборая, на малых полях я бы начинал с простого решения - как разместить самые длинные слова. Тут ведь важна читаемость.