有没有预先build立的方法来查找给定的string在JavaScript中的所有排列?

我是JavaScript世界的新手。 正如标题所提到的,我想知道在JavaScript中是否有预构build的方法来查找给定string的所有可能的排列。

例如 ,给出的input:

the 

期望的输出:

 the teh eht eth het hte 

没有预build,但写这样的function是可能的..这是一个相对简单的方法使用两个function:

 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"); 

现场testing案例: http : //jsfiddle.net/yahavbr/X79vz/1/

这只是基本的实现,它不会删除重复,也没有优化。 但是,对于小string,你不会有任何问题,像上面的testing用例一样添加时间度量,看看你的合理限制是什么。

 //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”]

假设要search一个大string,可以使用正则expression式

检查首先匹配字母和字母总数的一组可能性,

并返回使用与图案相同的字母集合的匹配。

//(不区分大小写)

 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();

这是类似的,但从一系列单词中find所有的字谜/排列。 我在接受采访时遇到了这个问题。 给定一系列的单词['猫','狗','tac','神','行为'],返回一个arrays,所有的字母组合在一起。 确保anagrams是独一无二的。

 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"] 
 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']

 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); } } 

那么没有任何内置函数在JS(我不认为它是在任何编码语言)……反正这是全function的程序,它省略了任何重复,并显示排列数… ..

 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(""); 
 <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>