【问题标题】:Naive Approach to Longest Common Subsequence最长公共子序列的朴素方法
【发布时间】:2015-12-22 09:30:16
【问题描述】:

我们在秋季季度学习了动态规划理论,我正在努力复习并继续进一步研究它。我目前正在尝试一种天真的方法来解决此 TopCoder 文章中提到的 LCS 问题:Dynamic Programming

算法如下:

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

【问题讨论】:

  • ABEACE 都是 LCS 的有效答案,除非您有任何其他条件,我看不出有任何问题 :)

标签: c++ string algorithm lcs longest-substring


【解决方案1】:

正如 Pham 所说,两者都是正确的,但如果您想知道为什么是因为代码的最后一部分

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

如果 a.length() = b.length() 你总是返回 b。长度相同并不意味着它们相等。这就是为什么你有不同的答案但正确的答案:)

【讨论】:

  • 谢谢 Pham 和 Nasim!我非常感谢您的帮助。唷。
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 2011-03-01
  • 2011-02-25
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多