问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JS关于字符串和数组的问题

发布网友 发布时间:2022-04-23 07:47

我来回答

2个回答

懂视网 时间:2022-04-23 12:08

本文主要和大家分享JS关于字符串的全排列算法及内存溢出详解,给定字符串,求出所有由该串内字符组合的全排列。所包含的字符不重复。

输入:"abc"
输出:["abc","acb","bac","bca","cab","cba"]

我在实现算法时遇到了一个问题,至今无法解决。但是全排列算法又很重要,所以写这篇文章记录一下。

算法一:递归

算法思想:

  1. 当字符串长度为1时,输出该字符串;

  2. 当长度大于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 < preResult.length; j++) {
  for (var k = 0; k < preResult[j].length + 1; k++) {
  //将首字母插入k位置 
  var temp = preResult[j].slice(0, k) + str[0] + preResult[j].slice(k);
  result.push(temp);
  }
 }
 return result;
 }
}

算法应该不难理解吧。但是当传参的字符串是"abcdefghijkl"时,排列用到的空间是12!=479001600,过大的内存占用导致内存溢出。如果你是在自己的PC上执行,那么可以使用node --max-old-space-size=8192来修改内存。但是我需要在Codewars上执行,所以无法修改内存。于是我想的办法是利用尾递归优化。呵呵,Node的尾递归优化?不管了,先试试吧。

算法二:尾递归

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 < result.length; i++) {
  let item = result[i];
  let itemLen = item.length;
  for (let j = 0; j < itemLen+1; j++) {
   let temp = item.slice(0, j) + str[0] + item.slice(j);
   tempArr.push(temp);
  }
  }
 }
 //递归截取了第一个字符的子串
 return permutate(str.slice(0),tempArr);
 }
}
permutate("abcdefghijkl",[]);

函数的第一个参数是本次递归的字符串,第二个参数是前x个字符的全排列结果。
思路是:

  1. 每次取当次递归串的第一个字母;

  2. 若第二个参数长度为0说明是第一次递归,则初始化本次结果为[首字母]。然后将首字母从递归串中剔除,剩余串传给下一次递归;

  3. 之后每一次递归,都取递归串的首字母,将其插入前x个字符的全排列的所有位置,求出x+1个字符的全排列;

  4. 递归直到第一个参数为空串,则第二个参数为字符串所有字符的全排列。

    可能不太好理解,不过知道这是尾递归就行了。虽然尾递归在ES6的严格模式中才有效,但是,我加上'use strict';后仍然无效。事实上我认为并不是函数调用栈的溢出,而是存放变量的堆溢出。所以,大概是无解了吧。毕竟全排列不管怎么样,空间复杂度都是O(n!)的。

算法三:循环

最后再贴个循环的代码吧,也是没什么用,就当扩展思路了。

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 < result.length; i++) {
  let item = result[i];
  let itemLen = item.length;
  for (let j = 0; j < itemLen+1; j++) {

   let temp = item.slice(0, j) + subStr[0] + item.slice(j);
   tempArr.push(temp);
  }
  }
  result = tempArr;
  tempArr = [];
 }
 subStr = subStr.slice(1);
 }
 return result;
}

相关推荐:

JS全排列组合算法实现方法

JavaScript几种递归全排列算法实例详解

JavaScript趣题:全排列去重

热心网友 时间:2022-04-23 09:16

var str = '209^140730-001(3_6.00);209^140730-001(1_4.40);210^140730-002(3_2.59);210^140730-002(1_3.50)';
var arr = str.split(';');
var i = 0, len = arr.length, result = {}, leftPos, key, value;
for(; i < len; i++){
    leftPos = arr[i].indexOf('(');
    key = arr[i].substring(0, leftPos);
    value = arr[i].substring(leftPos + 1, arr[i].length - 1);
    result[key] = result[key] ? (result[key] + ',' + value) : value;
}
    
var resultStr = [];
for(key in result){
    resultStr.push(key + '(' + result[key] + ')');
}

alert(resultStr.join(';'));

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长沙到西昌。坐火车先从长沙到成都、成都东,再到西昌,哪个方便一些 S先生与P先生谜题的题面 为什么首都设在襄阳 改姓可以不随父母性吗 韩艺瑟怎么改姓? 纸、墨、笔、砚是中国传统的文房四宝,墨的使用最早在 [ ] A.商代后期... 想问下创维光伏E企赢模式有哪些优势,到底值不值得投资啊?有没有合作... 太平洋太享e保百万医疗值得入手吗?每年花多少钱? 爱e满分适合哪些人买?注意哪些问题? 太平洋太享e保百万医疗适合哪些人买?价格多少? 四川省巴中市二手车过户要多少钱 从杭州西站到桐庐县分水工业园区怎么走? 武汉东西湖区有多少食品公司?都有哪些? 古牧就是大白熊? 如何写改名申请书? 各种食用油的功效有什么不同? 哪种食用油最好?各种食用油的功效有什么不同? 不同食用油的营养功效及烹饪方法分别是什么? 有一个微信公众号是专门看电影的,新上映的电影都可以看,那个是什么 基础的分类是什么 王者荣耀微信头像 微信头像上武媚娘的妆是怎么整上去的 js 字符串的公式 为什么用手机在qq空间传照片只能传一张以前可以多选现在突然不行了 为什么手机qq空间传照片不能批量传 我们信阳人自己种的那种花豆,可以煮在稀饭里面的,我想知道它的食疗功效有哪些 花豆跟连子红枣相克吗 葵花籽,兰花豆,南瓜子哪个更上火 每天喝花生红小豆黄豆豆浆会不会上火 求一份c#的欧姆龙plc的tcp通讯,fins协议的,还是hostlink的都行,主要实现数字量开 我为什么我电脑上的操作中心图标关不掉?求高手解决 win7电脑的操作中心是干嘛用的??? 操作中心怎么打不开? 在Word页面中搜索一个关键词,要使用的快捷键是哪个? 听说2018二级建造师考试是在6月份,真的吗? 漂移的英语单词是什么? 2018年二级建造师什么时候领证? 新手机号几天可以申请? drifted 什么意思 谁能帮忙翻译一下_Climb,the 和 _Drift,the 这两个网名的意思啊! 现在一个手机号码注册后解绑,要过多久才能重新申请一个? 汽车火花塞类型是那些? 说微信注销十五天以后可以注册新的多长时间算十五天 怎样才能注册一个新的- 问一问 微信注销后绑定的手机号多久可以重新绑定另一个? 现在可以申请新的吗? 现在可以申请新的吗? 在武汉怎么申请加入自如搬家 新手机号几天可以申请 深圳~《自如家修》如何加入?