App下載

經(jīng)典Java面試題解析:最長公共子序列

回憶的沙漏 2023-07-08 09:30:00 瀏覽數(shù) (1379)
反饋

在Java的面試中,最長公共子序列(Longest Common Subsequence,LCS)問題是常見的動態(tài)規(guī)劃問題。它涉及尋找兩個序列中最長的共同子序列的長度。本文將介紹一道經(jīng)典的Java面試題——最長公共子序列,并提供詳細(xì)的解析和解題思路。

題目

給定兩個字符串s1和s2,要求編寫一個函數(shù)來計算它們的最長公共子序列的長度。

示例

 輸入:s1 = "ABCD", s2 = "ACDF" 輸出:3(最長公共子序列為 "ACD")

解析與解題思路

 最長公共子序列(LCS)問題可以通過動態(tài)規(guī)劃來解決。下面是使用動態(tài)規(guī)劃解決該問題的具體步驟:

  1. 創(chuàng)建一個二維數(shù)組dp,其中dp[i][j]表示字符串s1的前i個字符和字符串s2的前j個字符的最長公共子序列的長度。
  2. 初始化dp數(shù)組的第一行和第一列為0,表示當(dāng)一個字符串為空時,最長公共子序列的長度為0。
  3. 遍歷字符串s1和s2的所有字符,對于每個字符,比較它們是否相等:如果s1[i-1]和s2[j-1]相等,則將dp[i][j]設(shè)置為dp[i-1][j-1] + 1,表示在最長公共子序列的基礎(chǔ)上加上當(dāng)前字符。如果s1[i-1]和s2[j-1]不相等,則將dp[i][j]設(shè)置為dp[i-1][j]和dp[i][j-1]中的較大值,表示取左邊或上邊的最長公共子序列長度。
  4. 最終結(jié)果為dp[m][n],其中m和n分別為字符串s1和s2的長度。

下面是使用動態(tài)規(guī)劃解決該問題的Java代碼示例:

public class LongestCommonSubsequence {
    public static int longestCommonSubsequence(String s1, String s2) {
        int m = s1.length();
        int n = s2.length();

        int[][] dp = new int[m + 1][n + 1];

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }

        return dp[m][n];
    }

    public static void main(String[] args) {
        String s1 = "ABCD";
        String s2 = "ACDF";

        int length = longestCommonSubsequence(s1, s2);
        System.out.println("Length of longest common subsequence: " + length);
    }
}

在上述代碼中,我們使用動態(tài)規(guī)劃的方法計算字符串s1和s2的最長公共子序列的長度。通過比較字符是否相等,并根據(jù)動態(tài)規(guī)劃的思想,我們填充二維數(shù)組dp,最終得到最長公共子序列的長度。

結(jié)論

通過使用動態(tài)規(guī)劃,我們可以高效地計算兩個字符串的最長公共子序列的長度。這道經(jīng)典的Java面試題考察了面試者對動態(tài)規(guī)劃思想和算法的理解。理解動態(tài)規(guī)劃的基本原理和思考問題的方式對于解決復(fù)雜的優(yōu)化問題至關(guān)重要。在面試中,清晰地解釋算法思路和實現(xiàn)過程,展現(xiàn)出自己的編程能力和問題解決能力,將為面試成功奠定基礎(chǔ)。

 學(xué)java,就到java編程獅!


0 人點贊