您的位置:首页 > Web前端 > JavaScript

js算法:动态规划-最大公共子串与最大子段和

2015-08-28 14:18 736 查看
最大公共子串代码:

问题定义:比如输入两个字符串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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: