乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。
例:如下有兩個字串:
x:a b c b d a b
y:b d c a b a
查詢它們最長公共子串行。
則它們公共子串行有(b d a b)(b d a b) (b c b a)
找最長公共子串行長度lcs(x,y)
lcs(x[0],x[0])=0
lcs(x[1],x[1])=0 如果不相等為0
lcs(x[2],x[2])=0分情況:
lcs(x[1],x[2])=0
lcs(x[2],x[1])=1
此時lcs(x[2],x[2])=1 即取兩種情況的最大值
lcs(x[3],x[3])=2
lcs(x[4],x[4])=0分情況:
lcs(x[3],x[4])=2
lcs(x[4],x[3])=2
此時lcs(x[4],x[4])=2
lcs(x[5],x[5])=0分情況:
lcs(x[4],x[5)=3
lcs(x[5],x[4])=2
此時lcs(x[4],x[4])=3
。。。。。剩下的以此類推
偽**如下:
lcs(x,y,i,j)
key1:窮舉法
窮舉法需要遍歷出所有的可能,在這不考慮。
key2: 遞迴方法
static
intf
(char
a,char
b,int i,
int j)
else
if(a[i]
== b[j]
)else
}static
intmax
(int a,
int b)
public
static
void
main
(string[
] args)
for(
int i =
0; i < t2.length; i++
) system.out.
println(f
(s1.
tochararray()
, s2.
tochararray()
,4,4
));}
key3:備忘錄法static
intf
(char
a,char
b,int i,
int j,
int[
] bak)
else
if(a[i]
== b[j]
)else
return bak[i]
[j];
}static
intmax
(int a,
int b)
public
static
void
main
(string[
] args)
for(
int i =
0; i < t2.length; i++
)int
bak =
newint
[c1.length]
[c2.length]
;for
(int i =
0; i < c1.length; i++)}
system.out.
println(f
(c1, c2, c1.length -
1, c2.length -
1, bak));
}
key4:自底向上static
intf
(char
a,char
b,int i,
int j,
int[
] bak)
else
if(a[ii]
== b[jj]
)else}}
return bak[i]
[j];
}static
intmax
(int a,
int b)
public
static
void
main
(string[
] args)
for(
int i =
0; i < t2.length; i++
)int
bak =
newint
[c1.length]
[c2.length];
system.out.
println(f
(c1, c2, c1.length -
1, c2.length -
1, bak));
}
動態規劃 最長公共子串行
問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上公升的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要...
動態規劃 最長公共子串行
兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...
動態規劃 最長公共子串行
看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...