在javascript中是否有任何预构建的方法来查找给定字符串的所有排列?

bqf10yzr  于 2021-09-13  发布在  Java
关注(0)|答案(8)|浏览(252)

我是javascript领域的新手。正如标题提到的,我想知道javascript中是否有任何预构建的方法来查找给定字符串的所有可能排列。
例如,给定输入:

the

期望输出:

the
teh
eht
eth
het
hte
nkkqxpd9

nkkqxpd91#

没有预构建,但是编写这样的函数是可能的。。以下是使用两个函数的一种相对简单的方法:

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/
这只是一个基本的实现,它不会删除重复项,也没有优化。但是,对于小字符串,您不会有任何问题,可以像上面的测试用例中那样添加时间度量,看看您的合理限制是什么。

hec6srdp

hec6srdp2#

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

8e2ybdfx

8e2ybdfx3#

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”);
//输出返回:['the','teh','het','hte','eth','eht']

acruukt9

acruukt94#

假设要搜索一个大字符串,可以使用正则表达式
要检查首先匹配字母和字母总数的一组可能性,
并返回与模式使用相同字母集的匹配项。
//(不区分大小写)

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

字母集(“the”).sort();

50pmv0ei

50pmv0ei5#

这是类似的,但从一个单词数组中查找所有的字谜/排列。我在一次采访中提出了这个问题。给定一个单词数组['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"]
6qfn3psc

6qfn3psc6#

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

8iwquhpp7#

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

nkhmeac68#

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

相关问题