我是靠谱客的博主 香蕉摩托,最近开发中收集的这篇文章主要介绍LCS算法(Longest Common Sequence),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

LCS算法

Longest Common Sequence

假设存在两个字符串序列 X 和 Y

X = { x 1 , x 2 , . . . , x n } X = {x_1, x_2, ..., x_n} X={x1,x2,...,xn}

Y = { y 1 , y 2 , . . . , y n } Y = {y_1, y_2, ..., y_n} Y={y1,y2,...,yn}

考虑两个序列最后一个元素是否相等,可以得到
L C S ( x n , y m ) = { L C S ( x n − 1 ,   y m − 1 ) + 1 , x n = y m m a x ( L C S ( x n − 1 , y m ) ,   L C S ( x n , y m − 1 ) ) , x n ! = y m LCS(x_n, y_m) = begin{cases} LCS(x_{n-1}, y_{m-1})+1 quad , x_n = y_m\ max(LCS(x_{n-1}, y_m), LCS(x_n, y_{m-1})) quad ,x_n != y_m\ end{cases} LCS(xn,ym)={LCS(xn1, ym1)+1,xn=ymmax(LCS(xn1,ym), LCS(xn,ym1)),xn!=ym

同时考虑到当字串为0的时候就不存在相等元素,完善递推式
L C S ( x n , y m ) = { 0 , n = 0   o r   m = 0 L C S ( x n − 1 ,   y m − 1 ) + 1 , x n = y m m a x ( L C S ( x n − 1 , y m ) ,   L C S ( x n , y m − 1 ) ) , x n ! = y m LCS(x_n, y_m) = begin{cases} 0 quad ,n = 0 or m = 0 \ LCS(x_{n-1}, y_{m-1})+1 quad , x_n = y_m\ max(LCS(x_{n-1}, y_m), LCS(x_n, y_{m-1})) quad ,x_n != y_m\ end{cases} LCS(xn,ym)=0,n=0 or m=0LCS(xn1, ym1)+1,xn=ymmax(LCS(xn1,ym), LCS(xn,ym1)),xn!=ym
递推式即为dp方程。

递推的过程是把一个大问题转化成子问题,同时我们在写dp程序的时候要明白一点 任何大问题转化成子问题的前提是子问题已经得解,从而反推到大问题解决!!!,所以实际上这个递推式转化成方程就是当任一字符串长度为0的时候,无元素相同,即为dp[0][0] = 0 dp[0][1] = 0dp[1][0] = 0 , 然后就可以通过递推式求其他情况的答案了。

// LCS典型题

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string>

using namespace std;

const int N = 1e4 + 10;
int dp[N][N];

int main() {
    string a, b;
    getline(cin, a);
    getline(cin, b);

    for (int i = 1; i <= a.length(); i++) {
        for (int j = 1; j <= b.length(); j++) {
            if (a[i - 1] == b[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    
    cout << dp[a.length()][b.length()] << endl;
    return 0;
}

这里构造dp数组直接空出两行,表示任意一个序列长度为0的时候,无相同字符,对应位置数字为0

最后

以上就是香蕉摩托为你收集整理的LCS算法(Longest Common Sequence)的全部内容,希望文章能够帮你解决LCS算法(Longest Common Sequence)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部