Problem 1: Longest Common Substring 母体

substring问题讲究连续

Method 1

Step 1:DP定义

Step 2: Base Case

  • dp[0][0] = s[i] = t[j] ? 1:0

Step 3: Induction Rule

  • dp[i][j] =

    • case 1: s[i] == t[j]

      • dp[i][j] = dp[i-1][j-1] + 1

    • case2: s[i] != t[j]

      • dp[i][j] = 0

  • recursion 角度?

    • s[. i], t[. j] ---> s'[, i -1), t'[, j- 1)

Step 4: Fill in Order

  • dp[i-1][j- 1]

    • dp[i][j]

  • 从左到右,从上到下

Step 5: Return what

globalMax of all dp[i][j]

public String longestCommon(String source, String target) {
    char[] s = source.toCharArray();
    char[] t = source.toCharArray();
    
    int start = 0;
    int longest = 0;
    int[][] dp = new int[s.length][t.length];
    for (int i = 0; i < s.length; i++) {
        for (int j = 0; j < t.length; j++) {
            if (s[i] == t[j]) {
                if (i == 0  || j == 0) {
                    dp[i][j] = 1;
                } else {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
            } 
           // else {
           //     dp[i][j] = 0;
           // }
           if (longest < dp[i][j]) {
               longest = dp[i][j];
               start = i - longest + 1; //记录开始点
           }
        
        }
        return source.substring(start, start + longest);
    }
}

Method 2

Last updated