js算法:动态规划-最大公共子串与最大子段和
2015-08-28 14:18
736 查看
最大公共子串代码:
问题定义:比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2
动态规划思路:假设两个字符串分别为s和t,
最后就是要小心的就是临界位置:如若两个字符串中任何一个是空串,那么最长公共子串的长度只能是
最大子段和:
问题定义:对于给定序列a1,a2,a3……an,寻找它的某个连续子段,使得其和最大。如( -2,11,-4,13,-5,-2
)最大子段是{ 11,-4,13 }其和为20。
动态规划算法求解:
算法思路如下:
记
,则所求的最大子段和为:
由b[j]的定义知,当b[j-1]>0时,b[j]=b[j-1]+a[j],否则b[j]=a[j]。由此可得b[j]的动态规划递推式如下:
b[j]=max{b[j-1]+a[j],a[j]},1<=j<=n。
问题定义:比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2
动态规划思路:假设两个字符串分别为s和t,
s[i]和
t[j]分别表示其第
i和第
j个字符(字符顺序从
0开始),再令
L[i, j]表示以
s[i]和
t[j]为结尾的相同子串的最大长度。应该不难递推出
L[i, j]和
L[i+1,j+1]之间的关系,因为两者其实只差
s[i+1]和
t[j+1]这一对字符。若
s[i+1]和
t[j+1]不同,那么
L[i+1, j+1]自然应该是
0,因为任何以它们为结尾的子串都不可能完全相同;而如果
s[i+1]和
t[j+1]相同,那么就只要在以
s[i]和
t[j]结尾的最长相同子串之后分别添上这两个字符即可,这样就可以让长度增加一位。合并上述两种情况,也就得到
L[i+1,j+1]=(s[i]==t[j]?L[i,j]+1:0)这样的关系。
最后就是要小心的就是临界位置:如若两个字符串中任何一个是空串,那么最长公共子串的长度只能是
0;当
i为
0时,
L[0,j]应该是等于
L[-1,j-1]再加上
s[0]和
t[j]提供的值,但
L[-1,j-1]本是无效,但可以视
s[-1]是空字符也就变成了前面一种临界情况,这样就可知
L[-1,j-1]==0,所以
L[0,j]=(s[0]==t[j]?1:0)。对于
j为
0也是一样的,同样可得
L[i,0]=(s[i]==t[0]?1:0)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> 最大长度公共子串 </TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> <script> var str1="abcdefghijklname123what"; var str2="defghiwhatisyourname"; var L=[];//备忘录 记录L[i][j]最大长度子串L[i][j]=max(L[i-1][j-1]+1,0) getMaxSubStr(); function getMaxSubStr(){ for (var i=0;i<str1.length+1;i++) { L[i]=[]; L[i][0]=0; } for (var j=0;j<str2.length+1;j++ ) { L[0][j]=0; } var max=-1; var x=-1; var y=-1; for (var i=1;i<str1.length+1;i++ ) { for (var j=1;j<str2.length+1;j++ ) { //alert(str1[i-1]+":"+str2[j-1]); if(str1.charAt(i-1)==str2.charAt(j-1)){ L[i][j]=L[i-1][j-1]+1; } else{ L[i][j]=0; } //document.write(L[i][j]); if(L[i][j]>max){ max=L[i][j]; x=i-1; y=j-1; document.write("i="+i+";j="+j+";max="+max+"<br/>"); } } } //输出共同的子串 var str=[]; while(x>=0&&y>=0){ if(str1.charAt(x)==str2.charAt(y)){ str[--max]=str1.charAt(x); x--; y--; } else break; } var str_out=""; for (var i=0;i<str.length;i++ ) { str_out+=str[i]; } document.write(str_out); } </script> </HEAD> <BODY> </BODY> </HTML>
最大子段和:
问题定义:对于给定序列a1,a2,a3……an,寻找它的某个连续子段,使得其和最大。如( -2,11,-4,13,-5,-2
)最大子段是{ 11,-4,13 }其和为20。
动态规划算法求解:
算法思路如下:
记
,则所求的最大子段和为:
由b[j]的定义知,当b[j-1]>0时,b[j]=b[j-1]+a[j],否则b[j]=a[j]。由此可得b[j]的动态规划递推式如下:
b[j]=max{b[j-1]+a[j],a[j]},1<=j<=n。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> <script> var array=[-5 ,-6 ,-1 ,-5 ,-4 ,-7]; var b=0; var sum=0; for(var i=0;i<array.length;i++) { if(b>0) { b+=array[i]; document.write(b+";"+array[i]+"<br/>"); } else { b=array[i]; } if(b>sum) { sum=b; document.write("sum:"+sum+"<br/>"); } } document.write(sum); </script> </HEAD> <BODY> </BODY> </HTML>
相关文章推荐
- 身份证号码验证算法 javascript实现
- json解析转map
- 实体集合转JSON遇到的问题
- NET JSON XML帮助类
- Json转换利器Gson之实例一-简单对象转化和带泛型的List转化
- javascript常用代码大全
- js
- JSON Editor 中文文档
- 给服务器发送JSON数据
- JavaScript之数组去重
- 如何正确的使用json?如何在.Net中使用json?
- 【JSON】JavaScript删除json元素
- js实现带圆角的多级下拉菜单效果
- JS实现自动倒计时30秒后按钮才可用
- JavaScript高级之函数的四种调用形式
- JavaScript模块化学习基础
- js实现类似菜单风格的TAB选项卡效果代码
- JSONKit编译报错解决方法
- JavaScript基础知识整理
- js游戏人物上下左右跑步效果代码分享