把一个字符串中的字符从新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准。javascript
例如, aab
应该返回 2 由于它总共有6中排列 (aab
, aab
, aba
, aba
, baa
, baa
), 可是只有两个 (aba
and aba
)没有连续重复的字符 (在本例中是 a
)。java
思路:git
1.一个正则判断重复,把字符串换成数组,用ES6的解构和箭头函数来交换位置,array里面放字符串能组成的全部排列。github
2.用一个生成函数来生成全部的排列,这里用的是Heap's Algorithm全排列算法
,最后返回过滤掉重复的数组的长度便可。算法
let permAlone = str => { const reg = /(.)\1+/g,arr = str.split('') , array = []; let swap = (i1, i2) => [arr[i1],arr[i2]] = [arr[i2],arr[i1]]; let generate = len => { if (len === 1) { array.push(arr.join('')); } else { for (let i = 0; i < len; i++) { generate(len - 1); swap(len % 2 ? 0 : i, len - 1); } } }; generate(arr.length); return array.filter( str => !str.match(reg) ).length; }; permAlone('aab');
若是有不明白的地方请留言,若是有更好更简便更优化的方法请留言,谢谢。数组
更多内容请访问个人我的博客: Bblogapp