#include <iostream>
using namespace std;

int main() {

    string s1,s2;cin>>s1>>s2;
    int len1 = s1.length(),len2 = s2.length();
    if(len2<len1){
        string tem = s1;s1 = s2;s2 = tem;
        int x = len1;len1 = len2;len2 = x;
    }
    int pre = 0,ed = 0;
    int l = 0,r = 0;
    for(int i = 0;i<len1;i++){
        for(int j = 0;j<len2;j++){
            int idx = 0;
            while(s1[i+idx]==s2[j+idx]&&j+idx<len2&&i+idx<len1){
                idx++;
            }
            l = i,r = i+idx;
            if(r-l+1>ed-pre+1){
                ed = r,pre = l;
            }
        }
    }
    // cout<<pre<<' '<<ed;
    for(int i = pre;i<ed;i++){
        cout<<s1[i];
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

根据字符串长度从头到尾遍历,维护相同的子串的开头和结尾的位置,最后输出即可,注意字符串当时的长度我先判断长度最长的哪一个。

活动地址https://www.nowcoder.com/discuss/726480854079250432