1.第15-2题最长回文子序列leta="HelloWorld!";functionLCA(arr){letn=arr.length,ret=[],w=[];for(leti=0;iret[i][j-1]){ret[i][j]=ret[i+1][j];w[i][j]=w[i+1][j];}else{ret[i][j]=ret[i][j-1];w[i][j]=w[i][j-1];}}}return{ret,w};}let{ret,w}=LCA(a.split(''));console.log(ret[0][11])console.log(w)2.思考15-4Neatprinting3.思考题15-5Editingdistance/**desc:calculatedfrom源字符串经过有限步操作到目标字符串的最小代价*params:x:源字符串,y:目标字符串,cost:复制、替换、删除、插入、交换、结束这六个操作的开销*/functionedit_distance(x,y,cost){constm=x.length,n=y。长度;x=""+x;y=""+y;constc=[],op=[];让d={},p=0;c.push([0]);op.push(['']);for(leti=1;i1&&j>1&&x[i-1]===y[j]&&x[i]===y[j-1]){d['twiddle']=cost['twiddle']+c[i-2][j-2];}//在二层循环结束时计算看一下各种情况下kill的代价if(i===m&&j===n){for(letk=0;k${y[j]}`);休息;案例“插入”:打印(x,y,op,i,j-1,p);console.log(`插入:${y[j]}`);休息;案例“删除”:打印(x,y,op,i-1,j,p);console.log(`删除:${x[i]}`);休息;case"kill":print(x,y,op,p,j,p);console.log(`kill:${p}`);休息;案例“替换”:打印(x,y,op,i-1,j-1,p);console.log(`replace:${x[i]}->${y[j]}`);休息;case"twiddle":print(x,y,op,i-2,j-2,p);console.log(`twiddle:${x[i]}->${y[j-1]}${x[i-1]}->${y[j]}`);休息;}}constx='yydsyydsssssssssssssss',y='tydscs';constcost={'copy':0,'insert':2,'replace':1,'delete':2,'kill':3,'twiddle':2};constret=edit_distance(x,y,成本);打印(""+x,""+y,ret.op,x.length,y.length,ret.p);4.问题15-8基于seamcropping的图像压缩/**@params:A[m][n]:一个二维数组,用于标识m行n列的像素,*D[m][n]:保存每个像素删除后对应的损失值*@return:depress[m][n]:从第一行到第m行删除的第n个像素的最小损失值*op[m][n]:对应到最想丢的上一行元素的序号,-2:第一行,没有上一行,-1:n-1,0:n,1:n+2*q:取最小值对应的最后一行像素所在的列作为一个整体,通过depress[m-1][q],*op[m-1][q]递归得到最小loss得到每行删除的最小像素数*/functionSEAM(A,D){constm=A.length,n=A[0].length;constdepress=[],op=[];令q=0,qd=无穷大;for(leti=0;idepress[m-1][j]){q=j;}}return{depress,op,q};}functionprint(op,i,j){switch(j){case-2:break;case-1:print(op,i-1,j-1);休息;情况0:打印(操作,i-1,j);休息;情况1:打印(op,i-1,j+1);休息;}console.log(`行:${i}行:${j}`);}