Advertisement
giovani-rubim

Permutate / Combine

May 30th, 2019
556
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. let permutate = (str, each) => {
  2.     let now = str;
  3.     const len = str.length;
  4.     for (let n = 0; ; ) {
  5.         each(now);
  6.         ++ n;
  7.         let a = len - 2;
  8.         while (a >= 0 && now[a] >= now[a + 1]) --a;
  9.         if (a < 0) {
  10.             let s1 = '';
  11.             for (let i=len; i; s1 += now[--i]);
  12.             now = s1;
  13.         } else {
  14.             let b = len - 1;
  15.             for (; now[b] <= now[a]; --b);
  16.             let s1 = now.substring(0, a) + now[b];
  17.             const s2 = now.substring(a + 1, b);
  18.             const s3 = now.substring(b + 1, len);
  19.             for (let i=s3.length; i; s1 += s3[--i]);
  20.             s1 += now[a];
  21.             for (let i=s2.length; i; s1 += s2[--i]);
  22.             now = s1;
  23.         }
  24.         if (now === str) return n;
  25.     }
  26. };
  27. let combine = (str, each) => {
  28.     const idxMap = {};
  29.     const chrArr = [];
  30.     const maxArr = [];
  31.     const max = str.length;
  32.     for (let i=0; i<max; ++i) {
  33.         const chr = str[i];
  34.         let index = idxMap[chr];
  35.         if (index === undefined) {
  36.             idxMap[chr] = chrArr.length;
  37.             chrArr.push(chr);
  38.             maxArr.push(1);
  39.         } else {
  40.             ++ maxArr[index];
  41.         }
  42.     }
  43.     const nChars = chrArr.length;
  44.     const qtdArr = new Array(nChars).fill(0);
  45.     for (let n = 0; ; ) {
  46.         str = '';
  47.         for (let i=0; i<nChars; ++i) {
  48.             str += chrArr[i].repeat(qtdArr[i]);
  49.         }
  50.         each(str);
  51.         ++ n;
  52.         if (str.length === max) return n;
  53.         for (let i=0; i<nChars && ++ qtdArr[i] > maxArr[i]; qtdArr[i++] = 0);
  54.     }
  55. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement