No repeats please(freecodecamp高级算法6)
把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准
例如, aab
应该返回 2 因为它总共有6中排列 (aab
, aab
, aba
, aba
, baa
, baa
), 但是只有两个 (aba
and aba
)没有连续重复的字符 (在本例中是 a
).
function permAlone(str) { //使用正则匹配连续重复 var regex = /(.)\1+/g;//括号代表分组,\1表示获得和第一个分组里完全相同的内容 //把字符串转化为数组,便于处理 var arr = str.split(''); //储存全排列数组 var permutations = []; var tmp; //函数功能:对调位置 function swap(index1, index2) { tmp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = tmp; } //使用Heap's Algorithm生成全排列数组 function generate(n) { if (n === 1) { permutations.push(arr.join('')); } else { for (var i = 0;i< n ; ++i) {generate(n - 1); swap(n % 2 ? 0 : i, n - 1); } } } generate(arr.length); //把没有连续重复排列的数组过滤出来 var filtered = permutations.filter(function(string) { return !string.match(regex); }); //返回其数量 return filtered.length; } alert(permAlone("aabfcdf"));
Heap's algorithm全排列算法
procedure generate(n : integer, A : array of any): if n = 1 then output(A) else for i := 0; i < n - 1; i += 1 do generate(n - 1, A) if n is even then swap(A[i], A[n-1]) else swap(A[0], A[n-1]) end if end for generate(n - 1, A) end if
i=n时,算法产生所有全排列;
如果n是奇数,则将排列里的第一个元素与最后一个元素互换。如果n是偶数,将排列的第i个元素与最后一个元素互换。