把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准
例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa), 但是只有两个 (aba and aba)没有连续重复的字符 (在本例中是 a).
难点在于列举排列组合,获取到所有的排列组合再去重复可得解。
排列组合已经有现成的算法,Pascal语言版,详情可以查看https://en.wikipedia.org/wiki/Heap%27s_algorithm
javascript实现
function heap(string) {
var arr = string.split(''),
permutations = [];
function swap(a, b) {
var tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
function gen(n) {
if (n === 1) {
permutations.push(arr.join(''));
} else {
for (var i = 0; i != n; i++) {
gen(n - 1);
swap(n % 2 ? 0 : i, n - 1);
}
}
}
gen(arr.length);
return permutations;
}
其次是重复字符的正则表达式 var reg = /(.)\1/;
最终代码
function permAlone(string) {
return heap(string).filter(function(item) {
return !/(.)\1/.test(item);
}).length;
function heap(string) {
var arr = string.split(''),
permutations = [];
function swap(a, b) {
var tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
function gen(n) {
if (n === 1) {
permutations.push(arr.join(''));
} else {
for (var i = 0; i != n; i++) {
gen(n - 1);
swap(n % 2 ? 0 : i, n - 1);
}
}
}
gen(arr.length);
return permutations;
}
}