Ruby实现的最长公共子序列算法

   这篇文章主要介绍了Ruby实现的最长公共子序列算法,本文直接给出实现代码,需要的朋友可以参考下

  最长公共子序列,LCS,动态规划实现。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

#encoding: utf-8
#author: xu jin, 4100213
#date: Nov 01, 2012
#Longest-Commom-Subsequence
#to find a longest commom subsequence of two given character arrays by using LCS algorithm
#example output:
#The random character arrays are: ["b", "a", "c", "a", "a", "b", "d"] and ["a", "c", "a", "c", "a", "a", "b"]
#The Longest-Commom-Subsequence is: a c a a b
 
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("The random character arrays are: %s and %sn", x, y)
c = Array.new(x.size + 1){Array.new(y.size + 1)}
b = Array.new(x.size + 1){Array.new(y.size + 1)}
 
def LCS_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}
for i in (1..m) do
for j in(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
 
def Print_LCS(x, b, i, j)
return if(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 "The Longest-Commom-Subsequence is: "
Print_LCS(x, b, x.size, y.size)

时间: 2024-12-03 07:43:07

Ruby实现的最长公共子序列算法的相关文章

Ruby实现的最长公共子序列算法_ruby专题

最长公共子序列,LCS,动态规划实现. #encoding: utf-8 #author: xu jin, 4100213 #date: Nov 01, 2012 #Longest-Commom-Subsequence #to find a longest commom subsequence of two given character arrays by using LCS algorithm #example output: #The random character arrays are

利用C++实现最长公共子序列与最长公共子串_C 语言

一.问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列.最长公共子序列(Longest Common Subsequence, LCS),顾名思义,是指在所有的子序列中最长的那一个.子串是要求更严格的一种子序列,要求在母串中连续地出现.在上述例子的中,最长公共子序列为blog(cnblogs, belong),最长公共

Python最长公共子串算法实例_python

本文实例讲述了Python最长公共子串算法.分享给大家供大家参考.具体如下: #!/usr/bin/env python # find an LCS (Longest Common Subsequence). # *public domain* def find_lcs_len(s1, s2): m = [ [ 0 for x in s2 ] for y in s1 ] for p1 in range(len(s1)): for p2 in range(len(s2)): if s1[p1] =

算法系列(六)最长公共子序列(LCS)问题(连续子序列)的三种解法

最长公共子序列(LCS)问题有两种方式定义子序列,一种是子序列不要求不连续,一种是子序列 必须连续.上一章介绍了用两种算法解决子序列不要求连续的最终公共子序列问题,本章将介绍要求 子序列必须是连续的情况下如何用算法解决最长公共子序列问题. 仍以上一章的两个字符串 "abcdea"和"aebcda"为例,如果子序列不要求连续,其最长公共子序列为"abcda",如果子序列 要求是连续,则其最长公共子序列应为"bcd".在这种情况下

[算法系列之十九]最长公共子序列

题目 最长公共子序列 分析 有两个字符串S1和S2,求一个最长公共子串,即求字符串S3,它们同时是S1和S2的子串,且要求它们的长度最长,并确定这个长度.这个问题我们称之为最长公共子序列问题. 与求最长递增子序列一样,我们首先将原问题分割成一些子问题,我们用dp[i][j]表示S1中前i个字符和S2中前j个字符分别组成的两个前缀字符串的最长公共子串长度.显然的,当i,j较小时我们可以直接给出答案,如dp[0][j] 必等于0.那么,假设我们已经求的dp[i][j](0 <= i < x,0 &

算法知识之最长公共子序列问题(动态规划)

最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={x1,x2,-,xm},则另一序列Z={z1,z2,-,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,-,ik}使得对于所有j=1,2,-,k有:zj=xij.公共子序列:给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列.最长公共子序列:给

经典算法题每日演练——第四题 最长公共子序列

一: 作用        最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法,作为码农,此算法是我们的必备基本功. 二:概念      举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个,比如其中的cb,cgs等等都是其子序列,我们可以看出 子序列不见得一定是连续的,连续的那是子串.      我想大家已经了解了子序列的概念,那现在可以延伸到两个字符串了,那么大家能够看出:cnblogs和belong的公共子序列吗? 在你找出的公共子序列中,你能找出最长的公共子

支配点递推关系-求教下字符串最长公共子序列中支配点算法中几点问题。

问题描述 求教下字符串最长公共子序列中支配点算法中几点问题. 求支配点之间的递推关系 资料地址:http://www.doc88.com/p-140662466336.html

算法实现-求解利用最长公共子序列进行字符串重排序算法的代码

问题描述 求解利用最长公共子序列进行字符串重排序算法的代码 利用合并LCS表求出一张基于所给连接词二进制的表,利用这张表和连接词k再反过来求出LCS表