2011-03-08 25 views
15

我是JavaScript世界的新手。正如標題所提到的,我想知道在JavaScript中是否有任何預構建的方法來查找給定字符串的所有可能的排列組合。有沒有預先建立的方法來查找給定的字符串在JavaScript中的所有排列?

例如給定的輸入:

the 

所需的輸出:

the 
teh 
eht 
eth 
het 
hte 
+1

當你說預建,你的意思是內置?如果是這樣,答案是否。 – 2011-03-08 12:18:25

+0

+1這是一個有趣的問題。它歸結爲採取一組元素並返回構成這些元素的所有唯一有序集合的集合。 – Raynos 2011-03-08 12:20:44

+0

遐我說只有建在功能!而且我是js的新手,所以請以任何方式說出來! – 2011-03-08 12:28:10

回答

2

沒有預建的,但寫這樣的功能是可能的。這裏是使用一個相對簡單的方法兩個功能:

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/

這僅僅是基本的實現,它不會刪除重複,並沒有優化。但是對於小字符串,您不會遇到任何問題,請像上述測試用例那樣添加時間度量,並查看您的合理限制。

+3

-1這被打破。 'Hello World'的輸出數量可以計數。它應該有11!結果。例如,缺少字符串'hello wordl'。 – Raynos 2011-03-08 13:18:54

+0

感謝您的回覆:) – 2011-03-08 13:27:18

+0

@Raynos感謝您的領導,改進版本:http://jsfiddle.net/yahavbr/X79vz/3/但仍然缺少大量排列......仍在完善的修復工作。 FTR,「hello world」應該返回39916800項。 – 2011-03-08 13:36:47

1

假設一個大的字符串進行搜索,您可以使用正則表達式

檢查一組候選條件的,首先匹配的字母和字母的總數,

並返回使用火柴與圖案相同的字母。

//(不區分大小寫)

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

lettersets(一個或多個 '的')排序();

+0

很先進水平!但我仍然可以弄清楚這個代碼的作用! – 2011-03-08 15:38:51

+0

無論我嘗試輸入什麼,它都會返回一個空數組。 – MadPhysicist 2016-07-23 17:06:54

-1
<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> 
+0

這不起作用。 FindAllPermutations(「DUDE」,0);產生重複文件 – reformed 2015-01-24 18:00:08

14
//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」 ]

+1

這個答案比接受的更好。 – 2015-07-24 22:36:00

+0

此答案正常工作。請把它作爲接受的,OP。 – 2016-06-02 16:26:20

+2

如果交換參數並添加一個'start = start || 「」線來防止空的第二參數。 這樣你可以用'permutation('123')'調用它。 – mzywiol 2017-04-04 11:06:06

1

這是相似的,但是從一組單詞中找到所有的字謎/排列。我在接受採訪時遇到了這個問題。給定一組單詞['cat','dog','tac','god','act'],返回一個包含所有字母組合的數組。確保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"] 
0
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); 
    } 
} 
+0

Ant的問是否有任何內置的Javascript方法,而不是你做的一些代碼。 – Druzion 2015-12-18 11:45:42

0

嗯心不是任何內置在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(""); 
1
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; } 

置換( '的');
//輸出返回:['''','teh','het','hte','eth','eht']

相關問題