No repeats please (FCC高级算法)
把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准
例如, aab
应该返回 2 因为它总共有6中排列 (aab
, aab
, aba
, aba
, baa
, baa
), 但是只有两个 (aba
and aba
)没有连续重复的字符 (在本例中是 a
).
重点:
这题应该是高级算法最难的一题了,我到现在都还是不太理解 。 递归有点糊涂 , 首先要去了解全排列 , 这段代码我是看的@Aaron_L 的全排列程序 https://www.cnblogs.com/nowornever-L/p/6008954.html, 讲的也清楚 但是他是c++代码
js代码如下:
function permAlone(str) { // 匹配重复字符,若匹配出的字符不是空 ,则判断0号索引是否与原字符串相同 ,若相同则该字符串由同一个字符组成 var reg = str.match(/(.)\1+/g); if(reg!=null && reg[0] === str) { return 0; } var arr = str.split(''); var arrs = []; //将两元素值对调 function swap(array, i, j) { var t = array[i]; array[i] = array[j]; array[j] = t; } //全排列递归函数 function fullArray( array , index){ if(index >= array.length) { arrs.push(arr.join('')); } else { for( var i = index; i < array.length; i++) { swap(array, i, index); fullArray(array , index + 1); swap(array, i, index); } } } fullArray( arr , 0); //返回没有两字符重复在一起的数量 return arrs.filter(function(str){ return !str.match(/(.)\1+/g); }).length; }