题意:
给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。
方法一:
动态规划
思路:![]()
![]()
![]()
#include <bits/stdc++.h>
using namespace std;
int dp[155][155];
int main(){
string a,b;
cin >> a >> b;
int n1=a.size(),n2=b.size();
int res=0;
for(int i=1;i<=n1;i++){//二重循环
for(int j=1;j<=n2;j++){
if(a[i-1]==b[j-1])//如果相等,则+1
dp[i][j]=dp[i-1][j-1]+1;
else//否则,变为0
dp[i][j]=0;
res=max(res,dp[i][j]);//维护最大值
}
}
cout << res << endl;
return 0;
}
时间复杂度:
空间复杂度:![]()
方法二:
暴力
思路:二重循环枚举字符串a和字符串b的每个字符作为起点。从起点出发向后循环,寻找最长的公共子串,res维护最大值。最后,输出最大值。
#include <bits/stdc++.h>
using namespace std;
int main(){
string a,b;
cin >> a >> b;
int n1=a.size(),n2=b.size();
int res=0;
for(int i=0;i<n1;i++){//三重循环
for(int j=0;j<n2;j++){
int k=i,l=j;//二重循环遍历字符串a和字符串b的起点
while(k<n1&&l<n2&&a[k]==b[l]){//从起点出发遍历
k++;
l++;
}
res=max(res,k-i);//维护最大值
}
}
cout << res << endl;
return 0;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号