题意:
        给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。

方法一:
动态规划

思路:
          
                 
    

      


#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;
}

时间复杂度:
空间复杂度: