Взят от, https://github.com/mission-peace/interview/blob/master/src/com/interview/recursion/StringPermutation.java
и повторно реализовано в Javascript.
function permute(input) {
let countMap = new Map();
for (ch of input.split("")) {
//console.log(ch, countMap.has(ch));
if (countMap.has(ch)) {
let inc = countMap.get(ch) + 1;
countMap.set(ch, inc);
} else {
countMap.set(ch, 1);
}
}
//console.log(countMap);
str = new Array(countMap.size); //char[countMap.size()];
count = new Array(countMap.size); //int[countMap.size];
index = 0;
for (let [key, val] of countMap.entries()) {
//console.log(key, val);
str[index] = key;
count[index] = val;
index++;
}
//console.log(str, count);
resultList = new Array();
result = new Array(input.length); //char[input.length]
permuteUtil(str, count, result, 0, resultList);
return resultList;
}
function permuteUtil(str, count, result, level, resultList) {
if (level == result.length) {
resultList.push(result.join("")); //resultList.add(new String(result));
return;
}
for (let i = 0; i < str.length; i++) {
if (count[i] == 0) {
continue;
}
result[level] = str[i];
count[i]--;
permuteUtil(str, count, result, level + 1, resultList);
count[i]++;
}
}
permute("AABC").forEach((s) => console.log(s));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Выход соответствует ожидаемому:
AABC
AACB
ABAC
ABCA
ACAB
ACBA
BAAC
BACA
BCAA
CAAB
CABA
CBAA
Если вы хотите динамический c ввод и вывод через HTML и разрешить использовать не только отдельные символы (https://codepen.io/Alexander9111/pen/abOMpgz) :
Для ваших конкретных c примеров нам просто нужно ввести список через запятую, например «1,2,3» во входной тег HTML:
function permute(input) {
let countMap = new Map();
const input_arr = input.split(",");
for (ch of input_arr) {
//console.log(ch, countMap.has(ch));
if (countMap.has(ch)) {
let inc = countMap.get(ch) + 1;
countMap.set(ch, inc);
} else {
countMap.set(ch, 1);
}
}
//console.log(countMap);
str = new Array(countMap.size); //char[countMap.size()];
count = new Array(countMap.size); //int[countMap.size];
index = 0;
for (let [key, val] of countMap.entries()) {
//console.log(key, val);
str[index] = key;
count[index] = val;
index++;
}
//console.log(str, count);
resultList = new Array();
result = new Array(input_arr.length); //char[input.length]
permuteUtil(str, count, result, 0, resultList);
return resultList;
}
function permuteUtil(str, count, result, level, resultList) {
if (level == result.length) {
resultList.push(result.join(',')); //resultList.add(new String(result));
return;
}
for (let i = 0; i < str.length; i++) {
if (count[i] == 0) {
continue;
}
result[level] = str[i];
count[i]--;
permuteUtil(str, count, result, level + 1, resultList);
count[i]++;
}
}
//permute("1,2,3").forEach((s) => console.log(s));
const output_tag = document.getElementById("output");
const input_tag = document.getElementById("input");
const go = document.getElementById("go");
go.addEventListener("click", (e) => {
output_tag.innerText = permute(String(input_tag.value)).join("\n");
});
output_tag.innerText = permute(String(input_tag.value)).join("\n");
<h3>Input (comma separated):</h3>
<input id="input" value="1,2,3">
<br /><br />
<button id="go">Go</button>
<br>
<h3>Output:</h3>
<div id="output"></div>