解题思路
这是一个最长公共子串问题。关键点如下:
- 给定两个字符串(可能包含空格)
- 需要找出它们的最长公共连续子串的长度
- 字符串长度在1000以内
解题思路:
- 使用动态规划解决
- 创建二维
数组,
表示以
和
结尾的最长公共子串长度
- 当
时,
- 否则
- 在遍历过程中记录最大值
代码
#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数组存储中间结果