题意:
给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。
方法一:
动态规划
思路:![]()
![]()
![]()
#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; }
时间复杂度:
空间复杂度:![]()