本文主要和大家分享js关于字符串的全排列算法及内存溢出详解,给定字符串,求出所有由该串内字符组合的全排列。所包含的字符不重复。
输入:"abc" 输出:["abc","acb","bac","bca","cab","cba"]
我在实现算法时遇到了一个问题,至今无法解决。但是全排列算法又很重要,所以写这篇文章记录一下。
算法思想:
当字符串长度为1时,输出该字符串;
当长度大于1时,取字符串的首字母,求出长度-1的串的全排列,将首字母插入每一个排列的任意位置。
算法实现:
function permutate(str) { //保存每一轮递归的排列结果 var result = []; //初始条件:长度为1 if (str.length == 1) { return [str] } else { //求剩余子串的全排列,对每个排列进行遍历 var preResult = permutate(str.slice(1)); for (var j = 0; j <p>算法应该不难理解吧。但是当传参的字符串是<code>"abcdefghijkl"</code>时,排列用到的空间是<code>12!=479001600</code>,过大的内存占用导致内存溢出。如果你是在自己的PC上执行,那么可以使用<code>node --max-old-space-size=8192</code>来修改内存。但是我需要在Codewars上执行,所以无法修改内存。于是我想的办法是利用尾递归优化。呵呵,Node的尾递归优化?不管了,先试试吧。</p><h1>算法二:尾递归</h1><pre class="brush:php;toolbar:false">function permutate(str,result) { 'use strict'; let tempArr = []; //终止条件str长度为0 if (str.length == 0) { return result } else { //第一次递归时,插入首字母 if(result.length === 0){ tempArr.push(str[0]); }else{ for (let i = 0; i <p>函数的第一个参数是本次递归的字符串,第二个参数是前x个字符的全排列结果。<br>思路是:</p><ol class=" list-paddingleft-2"> <li><p>每次取当次递归串的第一个字母;</p></li> <li><p>若第二个参数长度为0说明是第一次递归,则初始化本次结果为<code>[首字母]</code>。然后将首字母从递归串中剔除,剩余串传给下一次递归;</p></li> <li><p>之后每一次递归,都取递归串的首字母,将其插入前x个字符的全排列的所有位置,求出x+1个字符的全排列;</p></li> <li> <p>递归直到第一个参数为空串,则第二个参数为字符串所有字符的全排列。</p> <p>可能不太好理解,不过知道这是尾递归就行了。虽然尾递归在ES6的严格模式中才有效,但是,我加上<code>'use strict';</code>后仍然无效。事实上我认为并不是函数调用栈的溢出,而是存放变量的堆溢出。所以,大概是无解了吧。毕竟全排列不管怎么样,空间复杂度都是O(n!)的。</p> </li> </ol><h1>算法三:循环</h1><p>最后再贴个循环的代码吧,也是没什么用,就当扩展思路了。</p><pre class="brush:php;toolbar:false">function perm(str) { let result = [],tempArr = []; let subStr = str; while (subStr.length !== 0) { if (result.length === 0) { result.push(str[0]); } else { for (let i = 0; i <p class="comments-box-content">相关推荐:</p><p class="comments-box-content"><a href="http://www.php.cn/js-tutorial-385800.html" target="_self">JS全排列组合算法实现方法</a></p><p class="comments-box-content"><a href="http://www.php.cn/js-tutorial-375288.html" target="_self">JavaScript几种递归全排列算法实例详解</a></p><p class="comments-box-content"><a href="http://www.php.cn/js-tutorial-350034.html" target="_self">JavaScript趣题:全排列去重</a></p>
以上就是JS关于字符串的全排列算法及内存溢出详解的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号