javascript写算法(一) 动态规划:最长公共子序列

csdn是疯了吗,右下角的广告是一个人站在猪屁股后面打它。。。看了一下居然是baidu算出来的广告嵌在了iframe里,fixed to viewport,真是够了。最近还频频出现的广告是一个光头男子双手抱头痛苦状趴在桌子上,上面写着”前端薪资多少“,好了,我已经看到未来的下场了:一个掉秃了毛的穷光蛋。

c++写算法比起其他语言来感觉还是有优势的,在STL的基础上,同样的一道算法题,往往实现起来C++的代码最短。但是!自从开始搞前端,很久没用了。。看还是没问题的,写的时候就有恍如隔世的感觉。。。说到底还是学艺不精啊。。。。

感觉js的“人造性”更强,比如数组和字符串都有很多自带的function,而且有一种不拘于数据类型的灵活性(严格说,也不知道是好坏,可能比较省事吧)。写算法的话,网上的提交工具许多是用node 中readline 输入输出(readline简单使用可参考http://www.jb51.net/article/100229.htm),不过需要自己解析下输入,这里正则的知识最好了解一点,然后输出在回调函数中console.log就可以了。

网上的算法题,普遍以c++,java 实现的多,其他语言少,js就更少了,之前看了一本巴西谁写的js数据结构与算法,也很简单。不过语言只是个壳子,道理是一样的。准备连载一些用 js实现的常见算法,我是个渣渣,代码基本都跑过,但可能有些冗余啊什么的,调试的时候忘了删掉。总之仅供参考。

第一篇,动态规划之最长公共子序列。原理参考这篇吧。dp[i][j]保存了LST的长度,lst保存了每一个增长中的子序列,当lst.length==dp[lena][lenb]时,为最长子序列之一,将其输出。

function lstd(stra,strb){
    var n,i,j;
    var dp=[],lst=[];
    var max=function(a,b){return (a>b?a:b);};
    var arr=stra.split("");
    var brr=strb.split("");
    var lena=arr.length;
    var lenb=brr.length;

    // core 
    for(i=0;i<lena+1;i++){
        dp[i]=[];
        for(j=0;j<lenb+1;j++){
        if(i==0||j==0) dp[i][j]=0;
        else if(arr[i]===brr[j]){dp[i][j]=dp[i-1][j-1]+1;}
        else{dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}
        }
    }
    var lst="";

    var traceback=function(i,j,lst){

        while(i>0&&j>0){
        if(arr[i-1]===brr[j-1]){
        lst+=arr[i-1];
        if(lst.length===dp[lena][lenb]){
    console.log(lst.split("").reverse().join(""));}//输出,这里用了数组的reverse和join方法
        i--;j--;
        }
        else{
            if(dp[i-1][j]>dp[i][j-1])
            {--i;}
            else if(dp[i-1][j]<dp[i][j-1])
            {--j;}
            else{
            traceback(i-1,j,lst);
            traceback(i,j-1,lst);
            return;   //千万不要忘了return!!!
            }
        }
        }
    };

    traceback(lena,lenb,lst);
    return dp[lena][lenb]; //公共子序列的最大长度

}



x="ABCBDAB";y="BDCABA";
lstd(x,y);

在谷歌上跑的,结果是:
BCBA
BCAB
BDAB
4

明天有个实习的面试,希望能过,但是感觉自己啥都不会,哎。。。。

更新:面试果然挂掉了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值