1. 程式人生 > 程式設計 >Java引數傳遞實現程式碼及過程圖解

Java引數傳遞實現程式碼及過程圖解

問題描述

假如有兩個字串,s1="people"和s2="eplm",我們要求他倆最長的公共子串。

示例:

輸入:

s1="people"
s2="eplm"

輸出:

2,因為s1和s2公共最長子串是pl

解:

1、暴力求解:暴力求解對於字串比較短的我們還可以接受,如果字串太長實在是效率太低,所以這種我們就不再考慮

2、動態規劃:我們用一個二維陣列dp[i][j]表示第一個字串前i個字元和第二個字串前j個字元組成的最長公共字串的長度,那麼我們在計算dp[i][j]的時候,我們首先要判斷s1.charAt(i)是否等於s2.charAt(j),如果不相等,說明當前字元無法構成公共子串,所以dp[i][j]=0。如果相等,說明可以構成公共子串,我們還要加上他們前一個字元構成的最長公共子串長度,也就是dp[i-1][j-1]。所以我們很容易找到遞推公式:

遞推公式:

if(s1.charAt(i) == s2.charAr(j))
       dp[i][j] = dp[i-1][j-1] + 1;
   else
      dp[i][j] = 0;

最長公共子串畫圖分析:

我們看到在動態規劃中,最大值不一定是在最後一個空格內,所以我們要使用一個臨時變數在遍歷的時候記錄下最大值。程式碼如下:

public static int maxLong(String str1, String str2) {
        if (str1 == null || str2 == null || str1.length() == 0 || str2.length() == 0)
            
return 0; int max = 0; int[][] dp = new int[str1.length() + 1][str2.length() + 1]; for (int i = 1; i <= str1.length(); i++) { for (int j = 1; j <= str2.length(); j++) { if (str1.charAt(i - 1) == str2.charAt(j - 1)) { dp[i][j]
= dp[i][j] + 1; } else { dp[i][j] = 0; } max = Math.max(max, dp[i][j]); } } return max; }