三个字符串的LCS(最长公共子序列)

给定三个长度均小于100的字符串,任务是在所有三个给定序列中找到最长的公共子序列。 例如:

null
Input : str1 = "geeks"          str2 = "geeksfor"          str3 = "geeksforgeeks"Output : 5Longest common subsequence is "geeks"i.e., length = 5Input : str1 = "abcd1e2"          str2 = "bc12ea"          str3 = "bd1ea"Output : 3Longest common subsequence is "b1e" i.e. length = 3.

这个问题只是一个扩展 LCS 假设输入序列分别为长度为m、n和o的X[0..m-1]、Y[0..n-1]和Z[0..o-1]。设L(X[0..m-1],Y[0..n-1],Z[0..o-1])是三个序列X,Y和Z的LCS的长度。以下是实现:

The idea is to take a 3D array to store the length of common subsequence in all 3 given sequences i. e., L[m + 1][n + 1][o + 1]1- If any of the string is empty then there   is no common subsequence at all then           L[i][j][k] = 02- If the characters of all sequences match   (or X[i] == Y[j] ==Z[k]) then        L[i][j][k] = 1 + L[i-1][j-1][k-1]3- If the characters of both sequences do    not match (or X[i] != Y[j] || X[i] != Z[k]    || Y[j] !=Z[k]) then        L[i][j][k] = max(L[i-1][j][k],                          L[i][j-1][k],                          L[i][j][k-1])

下面是上述想法的实现。

C++

// C++ program to find LCS of three strings
#include<bits/stdc++.h>
using namespace std;
/* Returns length of LCS for X[0..m-1], Y[0..n-1]
and Z[0..o-1] */
int lcsOf3( string X, string Y, string Z, int m,
int n, int o)
{
int L[m+1][n+1][o+1];
/* Following steps build L[m+1][n+1][o+1] in
bottom up fashion. Note that L[i][j][k]
contains length of LCS of X[0..i-1] and
Y[0..j-1]  and Z[0.....k-1]*/
for ( int i=0; i<=m; i++)
{
for ( int j=0; j<=n; j++)
{
for ( int k=0; k<=o; k++)
{
if (i == 0 || j == 0||k==0)
L[i][j][k] = 0;
else if (X[i-1] == Y[j-1] && X[i-1]==Z[k-1])
L[i][j][k] = L[i-1][j-1][k-1] + 1;
else
L[i][j][k] = max(max(L[i-1][j][k],
L[i][j-1][k]),
L[i][j][k-1]);
}
}
}
/* L[m][n][o] contains length of LCS for
X[0..n-1] and Y[0..m-1] and Z[0..o-1]*/
return L[m][n][o];
}
/* Driver program to test above function */
int main()
{
string X = "AGGT12" ;
string Y = "12TXAYB" ;
string Z = "12XBA" ;
int m = X.length();
int n = Y.length();
int o = Z.length();
cout << "Length of LCS is " << lcsOf3(X, Y,
Z, m, n, o);
return 0;
}


JAVA

// Java program to find LCS of three strings
public class LCS_3Strings {
/* Returns length of LCS for X[0..m-1], Y[0..n-1]
and Z[0..o-1] */
static int lcsOf3(String X, String Y, String Z, int m,
int n, int o)
{
int [][][] L = new int [m+ 1 ][n+ 1 ][o+ 1 ];
/* Following steps build L[m+1][n+1][o+1] in
bottom up fashion. Note that L[i][j][k]
contains length of LCS of X[0..i-1] and
Y[0..j-1]  and Z[0.....k-1]*/
for ( int i= 0 ; i<=m; i++)
{
for ( int j= 0 ; j<=n; j++)
{
for ( int k= 0 ; k<=o; k++)
{
if (i == 0 || j == 0 ||k== 0 )
L[i][j][k] = 0 ;
else if (X.charAt(i - 1 ) == Y.charAt(j - 1 )
&& X.charAt(i - 1 )==Z.charAt(k - 1 ))
L[i][j][k] = L[i- 1 ][j- 1 ][k- 1 ] + 1 ;
else
L[i][j][k] = Math.max(Math.max(L[i- 1 ][j][k],
L[i][j- 1 ][k]),
L[i][j][k- 1 ]);
}
}
}
/* L[m][n][o] contains length of LCS for
X[0..n-1] and Y[0..m-1] and Z[0..o-1]*/
return L[m][n][o];
}
/* Driver program to test above function */
public static void main(String args[])
{
String X = "AGGT12" ;
String Y = "12TXAYB" ;
String Z = "12XBA" ;
int m = X.length();
int n = Y.length();
int o = Z.length();
System.out.println( "Length of LCS is " +
lcsOf3(X, Y,Z, m, n, o));
}
}
// This code is contributed by Sumit Ghosh


Python3

# Python program to find
# LCS of three strings
# Returns length of LCS
# for X[0..m-1], Y[0..n-1]
# and Z[0..o-1]
def lcsOf3(X, Y, Z, m, n, o):
L = [[[ 0 for i in range (o + 1 )] for j in range (n + 1 )]
for k in range (m + 1 )]
''' Following steps build L[m+1][n+1][o+1] in
bottom up fashion. Note that L[i][j][k]
contains length of LCS of X[0..i-1] and
Y[0..j-1] and Z[0.....k-1] '''
for i in range (m + 1 ):
for j in range (n + 1 ):
for k in range (o + 1 ):
if (i = = 0 or j = = 0 or k = = 0 ):
L[i][j][k] = 0
elif (X[i - 1 ] = = Y[j - 1 ] and
X[i - 1 ] = = Z[k - 1 ]):
L[i][j][k] = L[i - 1 ][j - 1 ][k - 1 ] + 1
else :
L[i][j][k] = max ( max (L[i - 1 ][j][k],
L[i][j - 1 ][k]),
L[i][j][k - 1 ])
# L[m][n][o] contains length of LCS for
# X[0..n-1] and Y[0..m-1] and Z[0..o-1]
return L[m][n][o]
# Driver program to test above function
X = 'AGGT12'
Y = '12TXAYB'
Z = '12XBA'
m = len (X)
n = len (Y)
o = len (Z)
print ( 'Length of LCS is' , lcsOf3(X, Y, Z, m, n, o))
# This code is contributed by Soumen Ghosh.


C#

// C# program to find
// LCS of three strings
using System;
class GFG
{
/* Returns length of LCS
for X[0..m-1], Y[0..n-1]
and Z[0..o-1] */
static int lcsOf3(String X, String Y,
String Z, int m,
int n, int o)
{
int [,,]L = new int [m + 1,
n + 1, o + 1];
/* Following steps build
L[m+1][n+1][o+1] in bottom
up fashion. Note that
L[i][j][k] contains length
of LCS of X[0..i-1] and
Y[0..j-1] and Z[0.....k-1]*/
for ( int i = 0; i <= m; i++)
{
for ( int j = 0; j <= n; j++)
{
for ( int k = 0; k <= o; k++)
{
if (i == 0 ||
j == 0 || k == 0)
L[i, j, k] = 0;
else if (X[i - 1] == Y[j - 1] &&
X[i - 1] == Z[k - 1])
L[i, j, k] = L[i - 1,
j - 1,
k - 1] + 1;
else
L[i, j, k] = Math.Max(Math.Max(L[i - 1, j, k],
L[i, j - 1, k]),
L[i, j, k - 1]);
}
}
}
/* L[m][n][o] contains length
of LCS for X[0..n-1] and
Y[0..m-1] and Z[0..o-1]*/
return L[m, n, o];
}
// Driver Code
public static void Main()
{
string X = "AGGT12" ;
string Y = "12TXAYB" ;
string Z = "12XBA" ;
int m = X.Length;
int n = Y.Length;
int o = Z.Length;
Console.Write( "Length of LCS is " +
lcsOf3(X, Y, Z, m, n, o));
}
}
// This code is contributed
// by shiv_bhakt.


PHP

<?php
// PHP program to find
// LCS of three strings
/* Returns length of LCS for
X[0..m-1], Y[0..n-1] and Z[0..o-1] */
function lcsOf3( $X , $Y , $Z ,
$m , $n , $o )
{
$L [ $m + 1][ $n + 1][ $o + 1] = array ( array ( array ()));
/* Following steps build
L[m+1][n+1][o+1] in bottom
up fashion. Note that
L[i][j][k] contains length
of LCS of X[0..i-1] and
Y[0..j-1] and Z[0.....k-1]*/
for ( $i = 0; $i <= $m ; $i ++)
{
for ( $j = 0; $j <= $n ; $j ++)
{
for ( $k = 0; $k <= $o ; $k ++)
{
if ( $i == 0 || $j == 0|| $k == 0)
$L [ $i ][ $j ][ $k ] = 0;
else if ( $X [ $i - 1] == $Y [ $j - 1] &&
$X [ $i - 1] == $Z [ $k - 1])
$L [ $i ][ $j ][ $k ] = $L [ $i - 1][ $j - 1][ $k - 1] + 1;
else
$L [ $i ][ $j ][ $k ] = max(max( $L [ $i - 1][ $j ][ $k ],
$L [ $i ][ $j - 1][ $k ]),
$L [ $i ][ $j ][ $k - 1]);
}
}
}
/* L[m][n][o] contains length
of LCS for X[0..n-1] and
Y[0..m-1] and Z[0..o-1]*/
return $L [ $m ][ $n ][ $o ];
}
// Driver code
$X = "AGGT12" ;
$Y = "12TXAYB" ;
$Z = "12XBA" ;
$m = strlen ( $X );
$n = strlen ( $Y );
$o = strlen ( $Z );
echo "Length of LCS is " .
lcsOf3( $X , $Y , $Z ,
$m , $n , $o );
// This code is contributed
// by ChitraNayal
?>


Javascript

<script>
// Javascript program to find LCS of three strings
/* Returns length of LCS for X[0..m-1], Y[0..n-1]
and Z[0..o-1] */
function lcsOf3(X,Y,Z,m,n,o)
{
let L = new Array(m + 1);
for (let i = 0; i < m + 1; i++)
{
L[i] = new Array(n + 1);
for (let j = 0; j < n + 1; j++)
{
L[i][j] = new Array(o + 1);
for (let k = 0; k < o + 1; k++)
{
L[i][j][k] = 0;
}
}
}
/* Following steps build L[m+1][n+1][o+1] in
bottom up fashion. Note that L[i][j][k]
contains length of LCS of X[0..i-1] and
Y[0..j-1]  and Z[0.....k-1]*/
for (let i = 0; i <= m; i++)
{
for (let j = 0; j <= n; j++)
{
for (let k = 0; k <= o; k++)
{
if (i == 0 || j == 0 || k == 0)
L[i][j][k] = 0;
else if (X[i - 1] == Y[j - 1]
&& X[i - 1] == Z[k - 1])
L[i][j][k] = L[i - 1][j - 1][k - 1] + 1;
else
L[i][j][k] = Math.max(Math.max(L[i - 1][j][k],
L[i][j - 1][k]),
L[i][j][k - 1]);
}
}
}
/* L[m][n][o] contains length of LCS for
X[0..n-1] and Y[0..m-1] and Z[0..o-1]*/
return L[m][n][o];
}
/* Driver program to test above function */
let X = "AGGT12" ;
let Y = "12TXAYB" ;
let Z = "12XBA" ;
let m = X.length;
let n = Y.length;
let o = Z.length;
document.write( "Length of LCS is " +
lcsOf3(X, Y,Z, m, n, o));
// This code is contributed by avanitrachhadiya2155
</script>


输出:

Length of LCS is 2

另一种方法: (使用递归)

C++

// C++ program to find LCS of three strings
#include<bits/stdc++.h>
using namespace std;
string X = "AGGT12" ;
string Y = "12TXAYB" ;
string Z = "12XBA" ;
int dp[100][100][100];
/* Returns length of LCS for X[0..m-1], Y[0..n-1]
and Z[0..o-1] */
int lcsOf3( int i, int j, int k)
{
if (i==-1||j==-1||k==-1)
return 0;
if (dp[i][j][k]!=-1)
return dp[i][j][k];
if (X[i]==Y[j] && Y[j]==Z[k])
return dp[i][j][k] = 1+lcsOf3(i-1,j-1,k-1);
else
return dp[i][j][k] = max(max(lcsOf3(i-1,j,k),
lcsOf3(i,j-1,k)),lcsOf3(i,j,k-1));
}
// Driver code
int main()
{
memset (dp, -1, sizeof (dp));
int m = X.length();
int n = Y.length();
int o = Z.length();
cout << "Length of LCS is " << lcsOf3(m-1,n-1,o-1);
// this code is contributed by Kushdeep Mittal
}


JAVA

// Java program to find LCS of three strings
class GFG
{
static String X = "AGGT12" ;
static String Y = "12TXAYB" ;
static String Z = "12XBA" ;
static int [][][] dp = new int [ 100 ][ 100 ][ 100 ];
/* Returns length of LCS for X[0..m-1],
Y[0..n-1] and Z[0..o-1] */
static int lcsOf3( int i, int j, int k)
{
if (i == - 1 || j == - 1 || k == - 1 )
{
return 0 ;
}
if (dp[i][j][k] != - 1 )
{
return dp[i][j][k];
}
if (X.charAt(i) == Y.charAt(j) &&
Y.charAt(j) == Z.charAt(k))
{
return dp[i][j][k] = 1 + lcsOf3(i - 1 , j - 1 , k - 1 );
} else {
return dp[i][j][k] = Math.max(Math.max(lcsOf3(i - 1 , j, k),
lcsOf3(i, j - 1 , k)),
lcsOf3(i, j, k - 1 ));
}
}
// Driver code
public static void main(String[] args)
{
for ( int i = 0 ; i < 100 ; i++)
{
for ( int j = 0 ; j < 100 ; j++)
{
for ( int k = 0 ; k < 100 ; k++)
{
dp[i][j][k] = - 1 ;
}
}
}
int m = X.length();
int n = Y.length();
int o = Z.length();
System.out.print( "Length of LCS is "
+ lcsOf3(m - 1 , n - 1 , o - 1 ));
}
}
// This code has been contributed by 29AjayKumar


Python3

# Python3 program to find LCS of
# three strings
X = "AGGT12"
Y = "12TXAYB"
Z = "12XBA"
dp = [[[ - 1 for i in range ( 100 )]
for j in range ( 100 )]
for k in range ( 100 )]
# Returns length of LCS for
# X[0..m-1], Y[0..n-1] and Z[0..o-1]
def lcsOf3(i, j, k) :
if (i = = - 1 or j = = - 1 or k = = - 1 ) :
return 0
if (dp[i][j][k] ! = - 1 ) :
return dp[i][j][k]
if (X[i] = = Y[j] and Y[j] = = Z[k]) :
dp[i][j][k] = 1 + lcsOf3(i - 1 ,
j - 1 , k - 1 )
return dp[i][j][k]
else :
dp[i][j][k] = max ( max (lcsOf3(i - 1 , j, k),
lcsOf3(i, j - 1 , k)),
lcsOf3(i, j, k - 1 ))
return dp[i][j][k]
# Driver code
if __name__ = = "__main__" :
m = len (X)
n = len (Y)
o = len (Z)
print ( "Length of LCS is" ,
lcsOf3(m - 1 , n - 1 , o - 1 ))
# This code is contributed by Ryuga


C#

// C# program to find LCS of three strings
using System;
class GFG
{
static string X = "AGGT12" ;
static string Y = "12TXAYB" ;
static string Z = "12XBA" ;
static int [,,] dp = new int [100, 100, 100];
/* Returns length of LCS for X[0..m-1],
Y[0..n-1] and Z[0..o-1] */
static int lcsOf3( int i, int j, int k)
{
if (i == -1 || j == -1 || k == -1)
return 0;
if (dp[i, j, k] != -1)
return dp[i, j, k];
if (X[i] == Y[j] && Y[j] == Z[k])
return dp[i, j, k] = 1 + lcsOf3(i - 1, j - 1, k - 1);
else
return dp[i, j, k] = Math.Max(Math.Max(lcsOf3(i - 1, j, k),
lcsOf3(i, j - 1, k)),
lcsOf3(i, j, k - 1));
}
// Driver code
static void Main()
{
for ( int i = 0; i < 100; i++)
for ( int j = 0; j < 100; j++)
for ( int k = 0; k < 100; k++)
dp[i, j, k] = -1;
int m = X.Length;
int n = Y.Length;
int o = Z.Length;
Console.Write( "Length of LCS is " +
lcsOf3(m - 1, n - 1, o - 1));
}
}
// This code is contributed by DrRoot_


PHP

<?php
// PHP program to find LCS of three strings
$X = "AGGT12" ;
$Y = "12TXAYB" ;
$Z = "12XBA" ;
$dp = array_fill (0, 100, array_fill (0, 100, array_fill (0, 100, -1)));
/* Returns length of LCS for X[0..m-1], Y[0..n-1]
and Z[0..o-1] */
function lcsOf3( $i , $j , $k )
{
global $dp , $X , $Y , $Z ;
if ( $i == -1 || $j == -1 || $k == -1)
return 0;
if ( $dp [ $i ][ $j ][ $k ] != -1)
return $dp [ $i ][ $j ][ $k ];
if ( $X [ $i ] == $Y [ $j ] && $Y [ $j ] == $Z [ $k ])
return $dp [ $i ][ $j ][ $k ] = 1+lcsOf3( $i - 1, $j - 1, $k - 1);
else
return $dp [ $i ][ $j ][ $k ] = max(max(lcsOf3( $i - 1, $j , $k ),
lcsOf3( $i , $j - 1, $k )), lcsOf3( $i , $j , $k - 1));
}
// Driver code
$m = strlen ( $X );
$n = strlen ( $Y );
$o = strlen ( $Z );
echo "Length of LCS is " .lcsOf3( $m - 1, $n - 1, $o - 1);
// This code is contributed by mits
?>


Javascript

<script>
// Java program to find LCS of three strings
let X = "AGGT12" ;
let Y = "12TXAYB" ;
let Z = "12XBA" ;
let dp = new Array(100);
for (let i=0;i<100;i++)
{
dp[i]= new Array(100);
for (let j=0;j<100;j++)
{
dp[i][j]= new Array(100);
for (let k=0;k<100;k++)
{
dp[i][j][k]=-1;
}
}
}
/* Returns length of LCS for X[0..m-1],
Y[0..n-1] and Z[0..o-1] */
function lcsOf3(i,j,k)
{
if (i == -1 || j == -1 || k == -1)
{
return 0;
}
if (dp[i][j][k] != -1)
{
return dp[i][j][k];
}
if (X[i] == Y[j] &&
Y[j] == Z[k])
{
return dp[i][j][k] = 1 + lcsOf3(i - 1, j - 1, k - 1);
} else {
return dp[i][j][k] = Math.max(Math.max(lcsOf3(i - 1, j, k),
lcsOf3(i, j - 1, k)),
lcsOf3(i, j, k - 1));
}
}
// Driver code
let m = X.length;
let n = Y.length;
let o = Z.length;
document.write( "Length of LCS is "
+ lcsOf3(m - 1, n - 1, o - 1));
// This code is contributed by rag2127
</script>


输出:

Length of LCS is 2

本文由 萨希尔·查布拉(阿克库) .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享