anagramsTest.js
anagramsTest.js
'use strict';
const answer = require('./hiker.js');
const assert = require('assert');
assert.equal(answer.permutations("ab") instanceof Array, true);
assert.equal(answer.permutations("ab").toString(), ["ab","ba"].toString());
assert.equal(answer.permutations("a").toString(), "a");
assert.equal(answer.permutations("abc").toString(), ["abc","bac","bca","acb","cab","cba"].toString());
assert.equal(answer.permutations("aabbcc").length, 90);
assert.equal(answer.permutations("abcd").length, 24);
assert.equal(answer.permutations("abcd").length, answer.getAnaNum("abcd"));
assert.equal(answer.getAnaNum("biro"), 24);
assert.equal(answer.getAnaNum("abcde"), 120);
assert.equal(answer.getAnaNum("cass"), 12);
assert.equal(answer.getAnaNum("haaa"), 4);
// Do not remove this line.
// It is the green-traffic-llight pattern.
console.log('All tests passed');
anagrams.js
'use strict';
function factorial (num) {
if (num < 0) {
return -1;
}
else if (num === 0 || num === 1) {
return 1;
} else {
return (num * factorial(num - 1));
}
}
function getAnaNum(str) { //计算排列后的个数
var length = str.length;
var result = factorial(length);
var strObj = {};
for (var i = 0; i < str.length; i++) {
if (!strObj[str[i]]){
strObj[str[i]] = 0;
}
strObj[str[i]]++;
}
for (var value in strObj) {
result = result / factorial(strObj[value]);
}
return result;
}
function permutations(string) {
var result=[];
if(string.length === 1){
return [string];
}else{
var preResult=permutations(string.slice(1));
for (var j = 0; j < preResult.length; j++) {
for (var k = 0; k < preResult[j].length+1; k++) {
var temp = preResult[j].slice(0,k)+string[0]+preResult[j].slice(k);
result.push(temp);
}
}
return unique(result);
}
}
function unique(arr) {
var ret = [];
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (ret.indexOf(item) === -1) {
ret.push(item);
}
}
return ret;
}
module.exports.getAnaNum = getAnaNum;
module.exports.permutations = permutations;