0% found this document useful (0 votes)
14 views3 pages

Exp 9

The document describes an experiment to implement and analyze the time complexity of the Longest Common Subsequence algorithm. It includes the source code of the algorithm which uses dynamic programming to find the LCS between two strings and outputs the result along with the time taken.

Uploaded by

SongAholic
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
14 views3 pages

Exp 9

The document describes an experiment to implement and analyze the time complexity of the Longest Common Subsequence algorithm. It includes the source code of the algorithm which uses dynamic programming to find the LCS between two strings and outputs the result along with the time taken.

Uploaded by

SongAholic
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 3

Experiment: 09

Aim: To implement Longest Common Subsequence and analyze it’s time


complexity
Source Code:
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> dp, direction;
// contains direction for the lcs sequence....
// the three respective direction are: 0(up), 1(down) and 2(diagonal)

string finalLCS; // will store final lcs string

void getstring(string &s, string &t, int i, int j)


{
if (i < 0 || j < 0)
{
// before ending direction array traversal, reverse the string
int n = finalLCS.size();
for (int i = 0; i < n / 2; i++)
swap(finalLCS[i], finalLCS[n - 1 - i]);
return;
}
if (direction[i][j] == 2)
finalLCS += s[i], getstring(s, t, i - 1, j - 1);
else if (direction[i][j] == 0)
getstring(s, t, i - 1, j);
else
getstring(s, t, i, j - 1);
}
void lcs(string s, string t)
{
// assigning dp and direction tables
dp.assign(s.size() + 1, vector<int>(t.size() + 1));
direction.assign(s.size(), vector<int>(t.size()));
for (int i = 1; i <= s.size(); i++)
{
for (int j = 1; j <= t.size(); j++)
// if equal then diagonal+1
if (s[i - 1] == t[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1, direction[i - 1][j - 1] = 2;
// if unequal then max of up and left element...
else if (dp[i - 1][j] >= dp[i][j - 1])
dp[i][j] = dp[i - 1][j], direction[i - 1][j - 1] = 0;
else
dp[i][j] = dp[i][j - 1], direction[i - 1][j - 1] = 1;
}
// getstring function to traverse
getstring(s, t, s.size() - 1, t.size() - 1);
cout << "The Longest Common Subsequence of " << s << " and " << t << " is: " <<
finalLCS << endl;
}
int main()
{
string s, t;
cout << "Enter first string: ";
cin >> s;
cout << "Enter the second string: ";
cin >> t;
// algorithm start
clock_t c_start = clock();

lcs(s, t);
// algorithm ends
clock_t c_end = clock();
double time_taken = double(c_end - c_start);
cout << "Time taken by Longest Common Subsequence is: " << time_taken <<
"ms" << endl;
}
Output:

You might also like