Saturday, December 12, 2015

Longest common subsequence


#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

void lcsutil (vector <int> & first, vector <int> & second, vector <vector <int> > & arr) {
    int m = first.size();
    int n = second.size();
    
    for (int i = 0; i <= n; i++) {
        arr[0][i] = 0;
    }
    
    for (int i = 0; i <= m; i++){
        arr[i][0] = 0;
    }
    
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (first[i-1] == second[j-1]) {
                arr[i][j] = arr[i-1][j-1] + 1;
            } else if (arr[i-1][j] >= arr[i][j-1]) {
                arr[i][j] = arr[i-1][j];
            } else if (arr[i][j-1] > arr[i-1][j]){
                arr[i][j] = arr[i][j-1];
            }
        }
    }
    
    int index = arr[m][n];
    vector <int> longest (index);
    index--;
    
    int i = m;
    int j = n;
    
    while (i > 0 & j > 0) {
        if (first[i-1] == second[j-1]) {
            longest[index] = first[i-1];
            index--;
            i--;
            j--;
        } else if (arr[i-1][j] > arr[i][j-1]) {
            i--;
        } else {
            j--;
        }
    }
    
    for (int i = 0; i < arr[m][n]; i++){
        cout<<longest[i]<<" ";
    }
}


int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
    unsigned int m, n;
    
    cin>>m>>n;
    
    vector < int > first(m);
    vector < int > second(n);
    
    for (int i = 0; i < m; i++) {
        cin>>first[i];
    }
    
    for (int i = 0; i < n; i++) {
        cin>>second[i];
    }
    
    vector < vector <int> > arr ( m + 1 , vector <int> (n + 1));
    
    lcsutil (first, second, arr);
    
    return 0;
}

No comments: