LCS最长公共子序列求解及输出所有最长公共子序列问题

子串:原序列中必须连续的一段
子序列:原序列中可以不连续的一段
注意:无论是子串和子序列,元素的顺序都是原序列中的顺序

 

一个显而易见的事实就是当X[i] = Y[j] 的时候的所有取值中,选择最大到最长公共子序列长度的 1,2,3 。。。。N的递增子序列便是一个最长的公共子序列。

如上例所示,按顺序选取1,2,3,4的子序列对应的字符串序列就是答案。因此,问题转化为在第二组数据中,求取最长的递增子序列即LIS的弱化版。

/*cen:原始数据
*low:当前起始位置
*ran:当前序号
*maxr:最长长度
*ree:中间结果
*res:set去重
*/
void getAllChildren(vector<pair<char, int>> cen, int low ,int ran, int maxr,string &ree,set<string>& res)
{
    string re = "";
    re = ree;
    for (int i = low; i < sz(cen)-1; i++) {
        if (cen[i].second == ran) {
            ree += cen[i].first;
            if (ran == maxr)    res.insert(ree);
            if (ran + 1 > maxr)        getAllChildren(cen, i + 1, ran + 1, maxr, ree, res);
            ree = re;
        }        
    }
    return;
}

 

posted @ 2022-03-29 19:31  人间别久不成悲  阅读(70)  评论(0编辑  收藏  举报