JavaScript算法系列之

1.输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba

字符串拼接

(先理解不输入重复字符的)

1 1 function permutate(str) { 2 2 var result=[]; 3 3 if(str.length==1){ 4 4 return [str] 5 5 }else{ 6 6 var preResult=permutate(str.slice(1)); 7 7 for (var j = 0; j < preResult.length; j++) { 8 8 for (var k = 0; k < preResult[j].length+1; k++) { 9 9 var temp=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k); 1010 result.push(temp); 1111 } 1212 } 1313 return result; 1414 } 1515 } 1616 console.log(permutate("abc"));

上述方式不是用交换实现的 用的是字符串拼接的方法

原理:

固定第一个字符,递归取得第一个字符后面的各种字符串组合;

再把第一个字符与后面每一个字符交换,并同样递归获得收尾后面的字符串组合;

递归的出口为当只有一个字符的时候

理解的不用看一下算法流程了!

=============================================================================================================

假设输入abc

大概走一遍算法执行流程

第一步 str='abc';

第二步 到6行 preResult='bc' 递归

第三步 到6行  preResult='c' 递归

第四步 到第四行返回 [c]  此时回到第三步的递归 str = 'bc' 执行第7行往下的循环

循环完毕后result=['bc','cb'] 此时返回第二步的递归 str='abc' 执行7行往下的循环

第五步 循环完毕后result=['abc','bac','bca','acb','cab','cba'] 此时输出最终结果

 ============================================================================================================

字符串交换

1 1 function permutation(str){ 2 2 let result = []; 3 3 if(str.length === 1){ 4 4 return [str]; 5 5 }else{ 6 6 let last = permutation(str.slice(1)); 7 7 for(let i=0; i<last.length;i++){ 8 8 let ss = swap(str[0],last[i],result); 9 9 result=ss; 1010 } 1111 return result; 1212 } 1313 } 1414 function swap(a,b,result){ 1515 for(let i=0;i<b.length+1;i++){ 1616 let newStr = b; 1717 let sss = newStr.split(''); 1818 sss.splice(i,0,a); 1919 result.push(sss.join('')) 2020 } 2121 return result; 2222 } 2323 2424 let res = permutation('abc'); 2525 console.log(res);

对于有重复的字符串来说按照上述算法输出出来会有重复的组合,偷懒的解法是直接去重就可以了

加一句Array.from(new Set(permutate("abc")));

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

python百题大冲关-确定字符串是否是另一个的排列

挑战介绍实现一个算法来识别一个字符串str2是否是另一个字符串str1的排列。排列的解释如下:如果将str1的字符拆分开,重新排列后再拼接起来,能够得到str2,那么就说字符串str2是字符串str1的排列。本次挑战中,你需要在permutation.py文件中补充函数is_permutation的空缺部分