【FCC】No repeats please
生活随笔
收集整理的這篇文章主要介紹了
【FCC】No repeats please
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
把一個字符串中的字符重新排列生成新的字符串,返回新生成的字符串里沒有連續重復字符的字符串個數.連續重復只以單個字符為準
例如, aab 應該返回 2 因為它總共有6中排列 (aab, aab, aba, aba, baa, baa), 但是只有兩個 (aba and aba)沒有連續重復的字符 (在本例中是 a).
示例:
permAlone("aab") 應該返回一個數字.
permAlone("aab") 應該返回 2.
permAlone("aaa") 應該返回 0.
permAlone("aabb") 應該返回 8.
permAlone("abcdefa") 應該返回 3600.
permAlone("abfdefa") 應該返回 2640.
permAlone("zzzzzzzz") 應該返回 0.
思路:
首先,把第一個字符和其后面的字符一一交換。
接著,固定第一個字符,求后面所有字符的排列。這個時候我們仍把后面的所有字符分成兩部分:后面字符的第一個字符,以及這個字符之后的所有字符。然后把第一個字符逐一和它后面的字符交換。
去重的全排列就是從第一個數字起每個數分別與它后面非重復出現的數字交換。
代碼:
<script type="text/javascript">
function permAlone(str) {
var arr = str.split("");
var perarr = [];
var begin = 0;
//創建正則,如果字符串全重復,則直接return 0
var reg = /(.)\1+/g; //括號里面的代表分組,\1表示獲得和第一個分組里完全相同的內容,也就是匹配任意連續的字符
//如果字符全部重復,直接返回0
// if(arr.every(function(val){return val===arr[0];})){
// return 0;
// }
//推薦以下方法
if (str.match(reg) !== null && str.match(reg)[0] === str) {
return 0;
}
//用于交換的函數
function swap(index1, index2) {
var temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
//如果begin到了最后一個字符,可以將這個字符串加入到全排列數組中了
function permall(arr, begin) {
if (begin == arr.length - 1) {
perarr[perarr.length] = arr.join("");
// console.log(perarr);
return;
}
console.log(arr.length);
for (var i = 0;
(i + begin) < arr.length; i++) {
// console.log('begin:'+begin);
// console.log('begin+i:'+(begin+i));
swap(begin, begin + i);
// console.log(arr);
permall(arr, begin + 1);
// console.log('begin:'+begin);
// console.log('begin+i:'+(begin+i));
swap(begin, begin + i);
}
}
// console.log('arr:'+arr);
// console.log('begin:'+begin);
permall(arr, begin);
//返回相鄰不重復的數量
console.log('結束后:' + perarr);
return perarr.filter(function(val) {
// console.log(val);
// console.log(reg);
return !val.match(reg);
}).length;
}
</script>
轉自:http://www.bubuko.com/infodetail-1846458.html
總結
以上是生活随笔為你收集整理的【FCC】No repeats please的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【FCC】Inventory Updat
- 下一篇: 【FCC】Friendly Date R