簡體   English   中英

最長公共子序列的幼稚方法

[英]Naive Approach to Longest Common Subsequence

我們在秋季學期研究了動態編程理論,我正在嘗試重新梳理並繼續進行深入研究。 我目前正在嘗試解決本TopCoder文章中提到的LCS問題的幼稚方法: 動態編程

算法如下:

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)

例如,給定字符串“ ABCDE”和“ DACACBE”,最長的公共子序列是“ ACE”。

但是,我輸出有效的子字符串“ ABE”而不是正確的“ ACE”。 我的實施順序出了什么問題?

#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;
    }
  }
}

正如Pham所說,兩者都是正確的,但是如果您想知道為什么是由於代碼的最后一部分

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

如果a.length()= b.length()怎么辦,您總是返回b。 長度相同並不意味着它們相等。 這就是為什么您有不同的答案但正確的原因:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM