Есть ли какой-либо предварительно построенный метод для поиска всех перестановок заданной строки в JavaScript?
Я новичок в мире JavaScript. Как упоминается в заголовке, я хочу знать, есть ли какой-либо предварительно встроенный метод в JavaScript, чтобы найти все возможные перестановки данной строки.
Например, учитывая ввод:
the
Требуемый вывод:
the
teh
eht
eth
het
hte
Ответы
Ответ 1
Не построено заранее, но запись такой функции возможна.. вот один относительно простой способ использования двух функций:
function FindAllPermutations(str, index, buffer) {
if (typeof str == "string")
str = str.split("");
if (typeof index == "undefined")
index = 0;
if (typeof buffer == "undefined")
buffer = [];
if (index >= str.length)
return buffer;
for (var i = index; i < str.length; i++)
buffer.push(ToggleLetters(str, index, i));
return FindAllPermutations(str, index + 1, buffer);
}
function ToggleLetters(str, index1, index2) {
if (index1 != index2) {
var temp = str[index1];
str[index1] = str[index2];
str[index2] = temp;
}
return str.join("");
}
Использование:
var arrAllPermutations = FindAllPermutations("the");
Живой тестовый пример: http://jsfiddle.net/yahavbr/X79vz/1/
Это просто базовая реализация, она не будет удалять дубликаты и не имеет оптимизации. Однако для небольших строк у вас не будет проблем, добавьте временную меру, как в приведенном выше тестовом примере, и посмотрите, какой у вас разумный предел.
Ответ 2
//string permutation
function permutation(start, string) {
//base case
if ( string.length == 1 ) {
return [ start + string ];
} else {
var returnResult = [];
for (var i=0; i < string.length; i++) {
var result = permutation (string[i], string.substr(0, i) + string.substr(i+1));
for (var j=0; j<result.length; j++) {
returnResult.push(start + result[j]);
}
}
return returnResult;
}
}
перестановка ('', '123') вернет
[ "123", "132", "213", "231", "312", "321" ]
Ответ 3
function permutations(str){
if (str.length === 1)
return str;
var permut = [];
for (var i=0; i<str.length; i++){
var s = str[0];
var _new = permutations(str.slice(1, str.length));
for(var j=0; j<_new.length; j++)
permut.push(s + _new[j]);
str = str.substr(1, str.length -1) + s;
}
return permut; }
Перестановки (далее ');
// выходные данные возвращаются: ['the', 'teh', 'het', 'hte', 'eth', 'eht']
Ответ 4
Предполагая, что для поиска требуется большая строка, вы можете использовать регулярное выражение
чтобы изучить набор возможностей, которые сначала соответствуют буквам и общему числу букв,
и верните совпадения, которые используют ту же букву, что и шаблон.
//(без учета регистра)
function lettersets(str, pat){
var A= [], M, tem,
rx= RegExp('\\b(['+pat+']{'+pat.length+'})\\b', 'gi'),
pattern= pat.toLowerCase().split('').sort().join('');
while((M= rx.exec(str))!= null){
tem= M[1].toLowerCase().split('').sort();
if(tem.join('')=== pattern) A.push(M[1]);
};
return A;
}
букв (s, 'the'). sort();
Ответ 5
Это похоже, но находит все анаграммы/перестановки из массива слов. У меня был этот вопрос в интервью. Учитывая массив слов ['cat', 'dog', 'tac', 'god', 'act'], верните массив со всеми анаграммами, сгруппированными вместе. Убедитесь, что анаграммы уникальны.
var arr = ['cat', 'dog', 'tac', 'god', 'act'];
var allAnagrams = function(arr) {
var anagrams = {};
arr.forEach(function(str) {
var recurse = function(ana, str) {
if (str === '')
anagrams[ana] = 1;
for (var i = 0; i < str.length; i++)
recurse(ana + str[i], str.slice(0, i) + str.slice(i + 1));
};
recurse('', str);
});
return Object.keys(anagrams);
}
console.log(allAnagrams(arr));
//["cat", "cta", "act", "atc", "tca", "tac", "dog", "dgo", "odg", "ogd", "gdo", "god"]
Ответ 6
function swap(a, b, str) {
if (a == b)
str = str;
else {
str = str.split("");
var temp = str[a];
str[a] = str[b];
str[b] = temp;
str = str.join("");
}
}
function anagram(a1, b1, ar) {
if (a1 == b1)
document.write(ar + "<br/>");
else
for (i = a1; i < b1; i++) {
swap(a1, b1, ar);
anagram((a1) ++, b1, ar);
swap(a1, b1, ar);
}
}
Ответ 7
Ну нет никакой встроенной функции в js (я не верю, что это на любом языке кодирования)...... и так или иначе это полностью функционирующая программа, она не допускает повторений, а также отображает количество перестановок.....
var n=0;
var counter=0;
var storarr=new Array();
function swap(a,b,str) { //swaps the terms str[a] and str[b] and returns the final str
str = str.split("");
var temp = str[a];
str[a] = str[b];
str[b] = temp;
return str.join("");
}
function anagram(_a,_b,ar) { //actual function which produces the anagrams
if(_a == _b) {
storarr[n]=ar;
n++;
counter++;
}
else {
for(var i= _a;i<= _b;i++) {
ar=swap(_a,i,ar);
anagram(_a+1,_b,ar);
ar=swap(_a,i,ar);
}
}
}
function factorial(a) { //return a!
var x=1;
for(var i=1;i<=a;i++)
x=x*i;
return x;
}
var strl=prompt("Enter String:","");
var l=strl.length;
anagram(0,l-1,strl);
storarr.sort(); //sorts the storarr alphabetically
var storlen=storarr.length;
var cai=0;
var counterarr = new Array();
strl.split("");
for(var i=0;i<l;i=i+c) { //determines the number of times a term is repeating
var c=1;
for(var j=i+1;j<l;j++) {
if(strl[i]==strl[j])
c++;
}
counterarr[cai]=c;
cai++;
}
var yellow=1;
for(var i=0;i<counterarr.length;i++) { //multiplies the terms of the counter array
yellow=yellow*factorial(counterarr[i]);
}
counter=counter/yellow;
document.write("Count : " + counter + "<br />");
for(var i=0;i<storlen;i=i+yellow) { //prints the non-flagged terms in storarr
document.write(storarr[i] + "<br />");
}
strl.join("");
Ответ 8
<pre>
<script>
var count = 0;
var duplicate = false;
function FindAllPermutations(str, index) {
for (var i = index; i < str.length; i++) {
var newstr;
if (index == i) newstr = str;
else newstr = SwapLetters(str, index, i);
if (!duplicate) {
count++;
document.write(newstr + "\n");
if (i == index) duplicate = true;
} else if (i != index) duplicate = false;
FindAllPermutations(newstr, index + 1);
}
}
function SwapLetters(str, index1, index2) {
if (index1 == index2) return str;
str = str.split("");
var temp = str[index1];
str[index1] = str[index2];
str[index2] = temp;
return str.join("");
}
FindAllPermutations("ABCD", 0); // will output all 24 permutations with no duplicates
document.write("Count: " + count);
</script>