文章
166
粉丝
68
获赞
883
访问
91.6k
#include <bits/stdc++.h>
using namespace std;
int main() {
string s1, s2;
while (cin >> s1 >> s2) {
int maxLen = 0;
string longestSubstr;
for (int i = 0; i < s1.length(); i++) {
for (int j = 0; j < s2.length(); j++) {
int len = 0;
while (i + len < s1.length() && j + len < s2.length() && s1[i + len] == s2[j + len]) {
len++;
}
if (len >= maxLen) {
maxLen = len;
longestSubstr = s1.substr(i, len);
}
}
}
cout<<maxLen<<endl<<longestSubstr<<endl;
}
}
这个解法存在一些冗余,但是比较好写,核心代码是里面的三个循环,因为两个字符串的长度都很小,所以一可以这么写,然后需要注意的点就是,我们的循环逻辑,我们的目的是s2躺在那里,然后s1,从尾部对齐s2头部,然后直到s1头部对齐s2尾部,完成全部的匹配,这里采用的倒退法取s1,循环中,我们s1的开始是0 0与s2对齐的,然后随着j的增加,位置不断推向尾部,这之后i增加,j又变成了0...
登录后发布评论
你完全可以理解成,两个全部的公共子串的匹配