Ruby实现的最长公共子序列算法
最长公共子序列,LCS,动态规划实现。
#encoding:utf-8
#author:xujin,4100213
#date:Nov01,2012
#Longest-Commom-Subsequence
#tofindalongestcommomsubsequenceoftwogivencharacterarraysbyusingLCSalgorithm
#exampleoutput:
#Therandomcharacterarraysare:["b","a","c","a","a","b","d"]and["a","c","a","c","a","a","b"]
#TheLongest-Commom-Subsequenceis:acaab
chars=("a".."e").to_a
x,y=[],[]
1.upto(rand(5)+5){|i|x<<chars[rand(chars.size-1)]}
1.upto(rand(5)+5){|i|y<<chars[rand(chars.size-1)]}
printf("Therandomcharacterarraysare:%sand%s\n",x,y)
c=Array.new(x.size+1){Array.new(y.size+1)}
b=Array.new(x.size+1){Array.new(y.size+1)}
defLCS_length(x,y,c,b)
m,n=x.size,y.size
(0..m).each{|i|c[i][0]=0}
(0..n).each{|j|c[0][j]=0}
foriin(1..m)do
forjin(1..n)do
if(x[i-1]==y[j-1])
c[i][j]=c[i-1][j-1]+1;
b[i][j]=0
else
if(c[i-1][j]>=c[i][j-1])
c[i][j]=c[i-1][j]
b[i][j]=1
else
c[i][j]=c[i][j-1]
b[i][j]=2
end
end
end
end
end
defPrint_LCS(x,b,i,j)
returnif(i==0||j==0)
if(b[i][j]==0)
Print_LCS(x,b,i-1,j-1)
printf("%c",x[i-1])
elsif(b[i][j]==1)
Print_LCS(x,b,i-1,j)
else
Print_LCS(x,b,i,j-1)
end
end
LCS_length(x,y,c,b)
print"TheLongest-Commom-Subsequenceis:"
Print_LCS(x,b,x.size,y.size)