0

We studied dynamic programming theory over Fall quarter, and I'm trying to brush up and continue further studies into it. I'm currently trying a naive approach into the LCS problem as mentioned in this TopCoder article: Dynamic Programming

The algorithm is as follows:

function LCS(S, T)
   if S is empty or T is empty then
      return empty string

   if first char of S == first char of T then
       return (first char of S) + LCS(S - first char, T - first char)

   otherwise // first chars are different
       return longer of LCS(S - first char, T) and LCS(S, T - first char)

For example, given the strings "ABCDE" and "DACACBE", the longest common subsequence is "ACE".

However, my outputs the valid substring "ABE" instead of correct "ACE". What's wrong with the ordering of my implementation?

#include <iostream>
#include <string>
using namespace std;


string LCS(string s, string t);

int main(){
  string A = "ABCDE";
  string B = "DACACBE";
  cout << LCS(A,B) << endl;
  return 0;
}

string LCS(string s, string t){

  string sSub = "";
  string tSub = "";
  if(!s.empty())
    sSub = s.substr(1);
  if(!t.empty())
    tSub = t.substr(1);

  if(s.empty() || t.empty()){
    return ""; // return an empty string if either are empty
  }

  if(s[0] == t[0]){
    string firstOfS = "";
    firstOfS += s[0];
    firstOfS += LCS(sSub, tSub);
    return s[0] + LCS(sSub, tSub);
  }

  else{
    string a = LCS(sSub, t);
    string b = LCS(s, tSub);
    if(a.length() > b.length()){
      return a;
    }
    else{
      return b;
    }
  }
}
Jabberwocky
  • 48,281
  • 17
  • 65
  • 115
Parity Bit
  • 113
  • 1
  • 12
  • 3
    `ABE` and `ACE` are both valid answer for LCS except if you have any additional condition, I don't see any problem :) – Pham Trung Dec 22 '15 at 09:38

1 Answers1

0

as Pham said both are correct, but if you are wondering why it is because of the last part of your code

  else{
    if(a.length() > b.length()){
      return a;
    }
    else{
      return b;
    }
  }   

what if a.length() = b.length() you always return b. Having same length doesn't mean they are equal. thats why you have a different answer but correct one :)

Pham Trung
  • 11,204
  • 2
  • 24
  • 43
Nasim Saleh
  • 181
  • 1
  • 7