#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")
根据字符串长度从头到尾遍历,维护相同的子串的开头和结尾的位置,最后输出即可,注意字符串当时的长度我先判断长度最长的哪一个。