zoukankan      html  css  js  c++  java
  • JavaScript算法系列之-----------------字符串排列(JS实现)

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

    字符串拼接

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

     1 function permutate(str) {
     2     var result=[];
     3     if(str.length==1){
     4         return [str]    
     5     }else{  
     6         var preResult=permutate(str.slice(1));
     7         for (var j = 0; j < preResult.length; j++) {
     8             for (var k = 0; k < preResult[j].length+1; k++) {
     9                 var temp=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k);   
    10                 result.push(temp);              
    11             }
    12         }
    13         return result;
    14     }  
    15 }
    16 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 function permutation(str){
     2     let result = [];
     3     if(str.length === 1){
     4         return [str];
     5     }else{
     6         let last = permutation(str.slice(1));
     7         for(let i=0; i<last.length;i++){
     8             let ss = swap(str[0],last[i],result);
     9             result=ss;
    10         }
    11         return result;
    12     }
    13 }
    14 function swap(a,b,result){
    15     for(let i=0;i<b.length+1;i++){
    16         let newStr = b;
    17         let sss = newStr.split('');
    18         sss.splice(i,0,a); 
    19         result.push(sss.join(''))      
    20     }
    21     return result;
    22 }
    23 
    24 let res = permutation('abc');
    25 console.log(res);

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

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

  • 相关阅读:
    Spring基础知识
    Hibernate基础知识
    Struts2基础知识
    在eclipse里头用checkstyle检查项目出现 File contains tab characters (this is the first instance)原因
    java后台获取cookie里面值得方法
    ckplayer 中的style.swf 中的 style.xml 中的修改方法
    java hql case when 的用法
    Windows下Mongodb安装及配置
    Mongodb中经常出现的错误(汇总)child process failed, exited with error number
    Mac 安装mongodb
  • 原文地址:https://www.cnblogs.com/manru75/p/10280723.html
Copyright © 2011-2022 走看看