这是一道题:把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准
例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa), 但是只有两个 (aba and aba)没有连续重复的字符 (在本例中是 a).
function permAlone(str) {
var arr1 = str.split("");
var arr2 = [];
var arr3 = [];
var arr4 = [];
//创建相同字符的数组arr3
arr1.forEach(function(val){
arr2.push([val,val]);
});
console.log(arr2);
arr2.forEach(function(val){
arr3.push(val.join(""));
});
console.log(arr3);
//把arr3中重复的字符去掉,简化工作(其实还应该简化一下,arr1中并不是所有的字符都有重复)
arr3.forEach(function(val){
if(arr4.indexOf(val)==-1){
arr4.push(val);
}
});
console.log(arr4);
//全排列函数
function permute(input) {
var permArr = [],
usedChars = [];
function main(input){
var i, ch;
for (i = 0; i < input.length; i++) {
ch = input.splice(i, 1)[0];
usedChars.push(ch);
if (input.length == 0) {
permArr.push(usedChars.slice());
}
main(input);
input.splice(i, 0, ch);
usedChars.pop();
}
return permArr;
}
return main(input);
};
//应用全排列算法后得到arr一个二维数组
var arr = permute(str.split(""));
console.log(arr);
var arr0 = [];
//转换为一维数组
arr.forEach(function(val){
arr0.push(val.join(""));
});
console.log(arr0);
//正则表达式匹配测试
arr4.forEach(function(val){
reg = new RegExp(val,"");
//划重点,这个地方加过一个全局匹配(val,"g"),结果像["baa","baa"]这个数组只匹配一个;见文章末尾链接
function contac(va){
return !reg.test(va);
}
arr0 = arr0.filter(contac);
console.log(arr0);
});
//console.log(arr0);
return arr0.length;
//return str;
}
permAlone("abcdefa");
permAlone("aab");