把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准。
例如,“aab”应该返回“2”,因为它总共有6中排列(aab, aab, aba, aba, baa, baa),但是只有两个(aba, aba)没有连续重复的字符 (在本例中是a)。
function permAlone(str) {
//使用正则回溯匹配连续重复
var regex = /(.)\1+/g;
//把字符串转化为数组,便于处理
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(int) {
if (int === 1) {
permutations.push(arr.join(''));
} else {
for (var i = 0; i != int; ++i) {
generate(int - 1);
swap(int % 2 ? 0 : i, int - 1);
}
}
}
generate(arr.length);
//把没有连续重复排列的数组过滤出来
var filtered = permutations.filter(function(string) {
return !string.match(regex);
});
//返回其数量
return filtered.length;
}
例如permAlone("aab")
的结果输出为2。
THE END.
网友评论