解题思路

这是一个最长公共子串问题。关键点如下:

  1. 给定两个字符串(可能包含空格)
  2. 需要找出它们的最长公共连续子串的长度
  3. 字符串长度在1000以内

解题思路:

  1. 使用动态规划解决
  2. 创建二维 数组, 表示以 结尾的最长公共子串长度
  3. 时,
  4. 否则
  5. 在遍历过程中记录最大值

代码

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string str1, str2;
    getline(cin, str1);
    getline(cin, str2);
    
    int n = str1.length(), m = str2.length();
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
    int maxLen = 0;
    
    // 动态规划
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (str1[i-1] == str2[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
                maxLen = max(maxLen, dp[i][j]);
            }
        }
    }
    
    cout << maxLen << endl;
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        
        int n = str1.length(), m = str2.length();
        int[][] dp = new int[n + 1][m + 1];
        int maxLen = 0;
        
        // 动态规划
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (str1.charAt(i-1) == str2.charAt(j-1)) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                    maxLen = Math.max(maxLen, dp[i][j]);
                }
            }
        }
        
        System.out.println(maxLen);
    }
}
str1 = input()
str2 = input()

n, m = len(str1), len(str2)
dp = [[0] * (m + 1) for _ in range(n + 1)]
max_len = 0

# 动态规划
for i in range(1, n + 1):
    for j in range(1, m + 1):
        if str1[i-1] == str2[j-1]:
            dp[i][j] = dp[i-1][j-1] + 1
            max_len = max(max_len, dp[i][j])

print(max_len)

算法及复杂度

  • 算法:动态规划
  • 时间复杂度: - 需要遍历两个字符串的所有位置
  • 空间复杂度: - 需要二维dp数组存储中间结果