LCS算法詳解

一、LCS算法代碼

/**
 * 通過動態規劃的思想求出字符串 str1 和 str2 的最長公共子序列
 * 空間複雜度 O(nm)
 * 時間複雜度 O(nm)
 */
public static String getLCS(String str1, String str2) {
    int len1 = str1.length();
    int len2 = str2.length();
    int[][] dp = new int[len1][len2];

    // 初始化第一行
    for (int i = 0; i < len1; i++) {
        if (str1.charAt(i) == str2.charAt(0)) {
            dp[i][0] = 1;
        } else if (i != 0) {
            dp[i][0] = dp[i - 1][0];
        } else {
            dp[i][0] = 0;
        }
    }

    // 初始化第一列
    for (int j = 0; j < len2; j++) {
        if (str1.charAt(0) == str2.charAt(j)) {
            dp[0][j] = 1;
        } else if (j != 0) {
            dp[0][j] = dp[0][j - 1];
        } else {
            dp[0][j] = 0;
        }
    }

    // 通過動態規劃的思想,求出 dp 數組
    for (int i = 1; i < len1; i++) {
        for (int j = 1; j = 0 && j >= 0) {
        if (str1.charAt(i) == str2.charAt(j)) {
            sb.append(str1.charAt(i));
            i--;
            j--;
        } else if (i > 0 && dp[i][j] == dp[i - 1][j]) {
            i--;
        } else if (j > 0 && dp[i][j] == dp[i][j - 1]) {
            j--;
        }
    }

    return sb.reverse().toString();
}

二、LCS算法C語言

/*
 * 通過動態規劃的思想求出字符串 s1 和 s2 的最長公共子序列
 * 空間複雜度 O(nm)
 * 時間複雜度 O(nm)
 */
char* lcs(char *s1, char *s2) {
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int dp[len1][len2];

    // 初始化第一行
    for (int i = 0; i < len1; i++) {
        if (s1[i] == s2[0]) {
            dp[i][0] = 1;
        } else if (i != 0) {
            dp[i][0] = dp[i - 1][0];
        } else {
            dp[i][0] = 0;
        }
    }

    // 初始化第一列
    for (int j = 0; j < len2; j++) {
        if (s1[0] == s2[j]) {
            dp[0][j] = 1;
        } else if (j != 0) {
            dp[0][j] = dp[0][j - 1];
        } else {
            dp[0][j] = 0;
        }
    }

    // 通過動態規劃的思想,求出 dp 數組
    for (int i = 1; i < len1; i++) {
        for (int j = 1; j = 0 && j >= 0) {
        if (s1[i] == s2[j]) {
            res[dp[i][j] - 1] = s1[i];
            i--;
            j--;
        } else if (i > 0 && dp[i][j] == dp[i - 1][j]) {
            i--;
        } else if (j > 0 && dp[i][j] == dp[i][j - 1]) {
            j--;
        }
    }
    
    return res;
}

三、LCS算法公式

LCS(str1, str2) = LCS(str1-1, str2-1) + 1, if str1[m] = str2[n]

LCS(str1, str2) = max(LCS(str1-1, str2), LCS(str1, str2-1)), if str1[m] ≠ str2[n]

四、LCS算法偽代碼

算法輸入:兩個字符串 S 和 T

算法輸出:S 和 T 的最長公共子序列

dp[i][j] 表示 S[1:i] 和 T[1:j] 的最長公共子序列的長度

for i in 1 to |S|
    for j in 1 to |T|
        if S[i] == T[j]
            dp[i][j] = dp[i-1][j-1] + 1
        else
            dp[i][j] = max(dp[i-1][j], dp[i][j-1])
end for

五、LCS算法複雜度

根據偽代碼可以得出,LCS算法的時間複雜度是 O(nm),空間複雜度也是 O(nm)。

六、LCS算法C表和B表

在 LCA 算法中,B 表就是一個記錄點和深度信息的數組。在 LCS 算法中,B 表是一個記錄選擇路徑信息的數組,用於還原 LCS。C 表是記錄動態規劃狀態的數組,用於計算 LCS 長度。

    /*  簡化版 B表 */
    for (int i = 1; i <= len1; i++) {
        for (int j = 1; j = dp[i][j - 1]) {
                dp[i][j] = dp[i - 1][j];
                b[i][j] = '↑';
            } else {
                dp[i][j] = dp[i][j - 1];
                b[i][j] = '←';
            }
        }
    }

七、LCS算法怎麼輸出

通過反向遍歷 B 表,就能找到 LCS 了。

StringBuilder sb = new StringBuilder();
int i = len1;
int j = len2;
while (i > 0 && j > 0) {
    switch (b[i][j]) {
        case '↖':
            sb.append(str1.charAt(i - 1));
            i--;
            j--;
            break;
        case '↑':
            i--;
            break;
        case '←':
            j--;
            break;
        default:
            break;
    }
}
return sb.reverse().toString();

八、LCS算法是什麼意思

LCS 的全稱是 Longest Common Subsequence,即最長公共子序列,是一種計算兩個序列之間的最長公共子序列的算法。

九、LCS排名

在字符串匹配領域,LCS 算法是一種經典的方法,被廣泛應用於文本編輯器、代碼比較工具、版本控制工具等領域。同時,LCS 算法也是一個經典的動態規劃問題,被用作編程面試及其他計算機科學領域的課程提及。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/199289.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-04 19:15
下一篇 2024-12-05 10:20

相關推薦

  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群算法Python的介紹和實現

    本文將介紹粒子群算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群算法的原理 粒子群算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29
  • Python回歸算法算例

    本文將從以下幾個方面對Python回歸算法算例進行詳細闡述。 一、回歸算法簡介 回歸算法是數據分析中的一種重要方法,主要用於預測未來或進行趨勢分析,通過對歷史數據的學習和分析,建立…

    編程 2025-04-28
  • 象棋算法思路探析

    本文將從多方面探討象棋算法,包括搜索算法、啟發式算法、博弈樹算法、神經網絡算法等。 一、搜索算法 搜索算法是一種常見的求解問題的方法。在象棋中,搜索算法可以用來尋找最佳棋步。經典的…

    編程 2025-04-28

發表回復

登錄後才能評論