Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let permutate = (str, each) => {
- let now = str;
- const len = str.length;
- for (let n = 0; ; ) {
- each(now);
- ++ n;
- let a = len - 2;
- while (a >= 0 && now[a] >= now[a + 1]) --a;
- if (a < 0) {
- let s1 = '';
- for (let i=len; i; s1 += now[--i]);
- now = s1;
- } else {
- let b = len - 1;
- for (; now[b] <= now[a]; --b);
- let s1 = now.substring(0, a) + now[b];
- const s2 = now.substring(a + 1, b);
- const s3 = now.substring(b + 1, len);
- for (let i=s3.length; i; s1 += s3[--i]);
- s1 += now[a];
- for (let i=s2.length; i; s1 += s2[--i]);
- now = s1;
- }
- if (now === str) return n;
- }
- };
- let combine = (str, each) => {
- const idxMap = {};
- const chrArr = [];
- const maxArr = [];
- const max = str.length;
- for (let i=0; i<max; ++i) {
- const chr = str[i];
- let index = idxMap[chr];
- if (index === undefined) {
- idxMap[chr] = chrArr.length;
- chrArr.push(chr);
- maxArr.push(1);
- } else {
- ++ maxArr[index];
- }
- }
- const nChars = chrArr.length;
- const qtdArr = new Array(nChars).fill(0);
- for (let n = 0; ; ) {
- str = '';
- for (let i=0; i<nChars; ++i) {
- str += chrArr[i].repeat(qtdArr[i]);
- }
- each(str);
- ++ n;
- if (str.length === max) return n;
- for (let i=0; i<nChars && ++ qtdArr[i] > maxArr[i]; qtdArr[i++] = 0);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement