Advertisement
dark-Matter

Sequence-matching-1

Jan 7th, 2021
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. int main(int argc, char **argv) {
  7.  
  8.    string s1, s2;
  9.  
  10.    if (argc > 1) {
  11.        s1 = argv[1];
  12.        s2 = argv[2];
  13.    }
  14.    else {
  15.        cout << "s1: ";
  16.        cin >> s1;
  17.        cout << "s2: ";
  18.        cin >> s2;
  19.    }
  20.  
  21.    int n = s1.length(), m = s2.length();
  22.    int dp[n+1][m+1] = {0};
  23.  
  24.    // penalties
  25.    int gap = 2; // penalty for matching a character to a gap
  26.    int mis = 3; // penalty for matching a character to a different character
  27.  
  28.  
  29.    for (int i = 1; i < n+1; i++)
  30.        dp[i][0] = i*gap;
  31.  
  32.    for (int i = 1; i < m+1; i++)
  33.        dp[0][i] = i*gap;
  34.  
  35.    for (int i = 1; i < n+1; i++)
  36.        for (int j = 1; j < m+1; j++)
  37.        {
  38.            if ( s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1];
  39.            else dp[i][j] = min({dp[i][j-1] + gap, dp[i-1][j] + gap, dp[i-1][j-1] + mis});
  40.        }
  41.  
  42.    string s1_out="", s2_out="";
  43.  
  44.    int i=n, j=m;
  45.  
  46.    cout << "Gap Score: " << dp[n][m] << endl;
  47.  
  48.    while (i>0 && j > 0) {
  49.        if (dp[i-1][j] + gap == dp[i][j]) {
  50.            s1_out += s1[i-1];
  51.            s2_out += '-';
  52.            i--;
  53.        }
  54.        else if (dp[i][j-1] + gap == dp[i][j]) {
  55.            s1_out += '-';
  56.            s2_out += s2[j-1];
  57.            j--;
  58.        }
  59.        else if (s1[i-1] == s2[j-1] || dp[i-1][j-1] + mis == dp[i][j]) {
  60.            s1_out += s1[i-1];
  61.            s2_out += s2[j-1];
  62.            i--; j--;
  63.        }
  64.    }
  65.  
  66.    while (i--)
  67.        s1_out += s1[i];
  68.  
  69.    while (j--)
  70.        s2_out += s2[j];
  71.  
  72.    while (s1_out.length() > s2_out.length())
  73.        s2_out += '-';
  74.  
  75.    while (s2_out.length() > s1_out.length())
  76.        s1_out += '-';
  77.  
  78.    reverse(s1_out.begin(), s1_out.end());
  79.    reverse(s2_out.begin(), s2_out.end());
  80.  
  81.    cout << s1_out << '\n' << s2_out << endl;
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement