首頁  >  文章  >  後端開發  >  如何使用C++中最長的公共子序列演算法

如何使用C++中最長的公共子序列演算法

WBOY
WBOY原創
2023-09-19 15:54:35985瀏覽

如何使用C++中最長的公共子序列演算法

如何使用C 中的最長公共子序列演算法

最長公共子序列(Longest Common Subsequence,簡稱LCS)是一種常見的字串匹配問題,用於尋找兩個字串中最長的相同子序列。在C 中,我們可以使用動態規劃(Dynamic Programming)來解決LCS問題。

下面是一個C 程式碼範例,示範如何使用最長公共子序列演算法:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

string longestCommonSubsequence(string text1, string text2) {
    int m = text1.size();
    int n = text2.size();
    
    // 创建一个二维数组来存储中间结果
    vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
    
    // 进行动态规划,填充数组
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            // 如果当前字符相等,则在之前的基础上加1
            if (text1[i-1] == text2[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
            } else {
                // 如果当前字符不相等,则取左边或上边的最大值
                dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
            }
        }
    }
    
    // 根据dp数组构建最长公共子序列
    int i = m;
    int j = n;
    string lcs = "";
    while (i > 0 && j > 0) {
        if (text1[i-1] == text2[j-1]) {
            // 如果当前字符相等,则将字符加入最长公共子序列中
            lcs = text1[i-1] + lcs;
            i--;
            j--;
        } else {
            // 如果当前字符不相等,则根据dp数组移动指针
            if (dp[i-1][j] >= dp[i][j-1]) {
                i--;
            } else {
                j--;
            }
        }
    }
    
    return lcs;
}

int main() {
    string text1 = "ABCD";
    string text2 = "ACDF";
    
    string lcs = longestCommonSubsequence(text1, text2);
    
    cout << "最长公共子序列为:" << lcs << endl;
    
    return 0;
}

在上述程式碼中,我們首先使用動態規劃來建立一個二維數組dp ,其中dp[i][j]表示text1的前i個字元和text2的前 j個字元所構成的最長公共子序列的長度。然後,我們根據動態規劃的結果,利用dp陣列來建構最長公共子序列。最後,輸出最長公共子序列即可。

以上就是使用C 中最長的公共子序列演算法的一個範例。透過動態規劃的思想,我們可以有效率地解決LCS問題,找到兩個字串中最長的公共子序列。

以上是如何使用C++中最長的公共子序列演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn