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

IT技术 javascript
2021-02-25 17:14:04

我是 JavaScript 世界的新手。正如标题所提到的,我想知道 JavaScript 中是否有任何预先构建的方法来查找给定字符串的所有可能排列。

例如,给定输入:

the

期望的输出:

the
teh
eht
eth
het
hte
6个回答
//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;
    }
}

permutation('','123') 将返回

[“123”、“132”、“213”、“231”、“312”、“321”]

这个答案正常工作。请使它成为接受的一个,OP。
2021-04-26 17:14:04
如果您交换参数并添加start = start || ""一行以防止空的第二个参数,它会更有用这样你就可以用permutation('123').
2021-05-05 17:14:04
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; }

permutations('the');
//输出返回:[ 'the', 'teh', 'het', 'hte', 'eth', 'eht' ]

简短、干净、递归的方法。爱它。
2021-04-18 17:14:04

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

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/

这只是基本实现,它不会删除重复项,也没有优化。但是,对于小字符串,您不会有任何问题,请像上面的测试用例一样添加时间度量,看看您的合理限制是多少。

@Raynos 感谢提醒,改进版本:jsfiddle.net/yahavbr/X79vz/3但仍然缺少很多排列......仍在进行完整的修复。FTR,“hello world”应该返回包含 39916800 个项目的数组。
2021-04-19 17:14:04
@Shadow Better:index = index || 0;buffer = buffer || [];
2021-05-05 17:14:04
-1 那必须被打破。有可数数量的输出Hello World应该有11个!结果。hello wordl例如,缺少字符串
2021-05-12 17:14:04
@Anto 它将仅返回三个字母字符串的正确结果.. 其余的它将仅返回部分结果。尽管如此,您仍然可以从中获取一些想法,随时要求对代码中的特定行进行解释。
2021-05-13 17:14:04
但我不明白这个功能的任何东西..但无论如何谢谢:)
2021-05-16 17:14:04

假设要搜索一个大字符串,您可以使用正则表达式

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

并返回使用与模式相同的字母集的匹配项。

//(不区分大小写)

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

很高级的水平!但我仍然可以弄清楚这段代码的作用!
2021-05-12 17:14:04
无论我为什么尝试输入,这都会返回一个空数组。
2021-05-12 17:14:04

这很相似,但会从一组单词中找到所有字谜/排列。我在一次采访中遇到了这个问题。给定一组单词 ['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"]