#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
#include<string>
#include <bits/stdc++.h>
// 给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串。
// 注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。
using namespace std;
// 输入:
// h
// a
// 输出:0
string a, b, minn = " ";
// a和b是我们输入的
// minn存储的是我们最小的那个字符串
string cut(int l, int r)
{// l代表的左端点,r代表的右端点,然后我们把这段的a截取出来
string tmp = "";
for (int i = l; i <= r; i++) tmp += a[i];
return tmp;
}
void solve()
{
if (a.size() > b.size()) swap(a, b);// 我们让较短的那个字符串是a
for (int i = 0; i < a.size(); i++)
{// 这个让a的左端点从a的每一个位置开始枚举
for (int j = i; j < a.size(); j++)
{
// 这个是枚举a字符串截取的右端点
string tmp = cut(i, j);
// 获取我们截取出来的字符串
if (b.find(tmp) != string::npos)
//npos可以表示string的结束位子,是string::type_size 类型的,也就是find()返回的类型。
//find函数在找不到指定值得情况下会返回string::npos。
if (tmp.size() > minn.size()) minn = tmp;
// 如果b中有截取出来的这个字符串,那么我们就是会比较和我们之前
// 保存的最长长度字符串比较,一样的不更新,因为要保证我们取到
// 第一个最长的,然后大于的时候进行一个更新
}
}
//cout << minn << "\n";// 输出我们最小的那个字符串
if(minn.size()==1 && a.size()==1 && b.size()==1 && a!=b)//针对字符串1=h,字符串2=a的情况
cout<<" "<<endl;
//面向用例编程
else
cout<<minn<<endl;
}
int main() {
while(cin >> a >> b)
{
minn = " ";// 因为多组输入,所以我们要进行这样一个清空的操作
solve();
}
return 0;
}
计算两个字符串的最大公共子串
最新推荐文章于 2023-09-21 09:45:19 发布