首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >递归打印字符串的所有排列(Javascript)

递归打印字符串的所有排列(Javascript)
EN

Stack Overflow用户
提问于 2016-10-08 08:28:03
回答 5查看 49.2K关注 0票数 38

我已经在其他语言中看到过这个问题的版本,但没有在JS中。

是否可以在一个函数中递归地执行此操作?

我知道我需要获取字符串中的第一个元素,然后将其附加到字符串其余部分的递归的每个解决方案中。因此,从逻辑上讲,我理解递归需要如何进行。我只是不明白如何将第一个char附加到每个递归解决方案中

代码语言:javascript
复制
var myString = "xyz";

function printPermut(inputString){
    var outputString;
    if(inputString.length === 0){
        return inputString;
    }
    if(inputString.length === 1){
        return inputString;
    }
    else{
       for(int i = 0; i<inputString.length(); i++){
           //something here like: 
           //outputString = outputString.concat(printPermut(inputString.slice(1))??
           //maybe store each unique permutation to an array or something?
       } 
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-10-08 10:19:30

让我们编写一个函数,以数组的形式返回字符串的所有排列。由于您不需要任何全局变量,因此返回排列是至关重要的。

代码语言:javascript
复制
  function permut(string) {
  if (string.length < 2) return string; // This is our break condition

  var permutations = []; // This array will hold our permutations
  for (var i = 0; i < string.length; i++) {
    var char = string[i];

    // Cause we don't want any duplicates:
    if (string.indexOf(char) != i) // if char was used already
      continue; // skip it this time

    var remainingString = string.slice(0, i) + string.slice(i + 1, string.length); //Note: you can concat Strings via '+' in JS

    for (var subPermutation of permut(remainingString))
      permutations.push(char + subPermutation)
  }
  return permutations;
}

要打印它们,只需在之后迭代数组:

代码语言:javascript
复制
 var myString = "xyz";
 permutations = permut(myString);
 for (permutation of permutations)
   print(permutation) //Use the output method of your choice

希望我能帮助你回答你的问题。

票数 74
EN

Stack Overflow用户

发布于 2016-10-08 12:00:24

排列问题已经研究到死了。Heap's algorithm是一个众所周知的解决方案。以下是使用生成器的JS版本:

代码语言:javascript
复制
function *permute(a, n = a.length) {
  if (n <= 1) yield a.slice();
  else for (let i = 0; i < n; i++) {
    yield *permute(a, n - 1);
    const j = n % 2 ? 0 : i;
    [a[n-1], a[j]] = [a[j], a[n-1]];
  }
}

console.log(Array.from(permute("abcabad".split('')))
.map(perm => perm.join(''))
.filter((el, idx, self) => (self.indexOf(el) === idx)));

permute旨在获取并生成数组,而不是字符串,因此我们在调用字符串之前将其拆分为字符,并在打印结果之前将字符粘贴回字符串中。

票数 46
EN

Stack Overflow用户

发布于 2020-01-02 21:00:06

代码语言:javascript
复制
permutation=(str,prefix)=>{
   if(str.length==0){
      console.log(prefix);
   }
   else{
      for(let i=0;i<str.length;i++){
          let rem = str.substring(0,i)+str.substring(i+1);
          permutation(rem,prefix+str[i]);
       }
    }
 }
 let str="ABC";
 permutation(str,"");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39927452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档