两个字符串最长公共子串
给定两个字符串,找出最长公共子串,并返回该子串,如果不存在则返回-1.
示例输入
abcdefg abcbcdefg
示例输出
bcdefg
示例输入
zxcvbnm asdfghjkl
示例输出
-1
#include<iostream>
#include<algorithm>
using namespace std;
string func(string str1, string str2)
{
string res;
int max_len = 0, ar[2] = { 0,0 };
for (int i = 0; i < str1.length(); ++i)//每次都是以str1的第i个字符对str2进行遍历
{
for (int j = 0; j < str2.length(); ++j)
{
int len = 0, tmp = i;
while (str1[tmp] != str2[j] && j < str2.length())//找到第一个相同的字符
++j;
if (j == str2.length())
break;
while (str1[tmp] == str2[j] && tmp < str1.length() && j < str2.length())//看一下后续是否相同
{
++tmp, ++j, ++len;
}
if (len > max_len)//找出最长若大于max_len,则替换max_len并退出次层从i开始比对的循环
{
max_len = len;
ar[0] = tmp - len;
ar[1] = tmp;
break;
}
}
}
if (max_len == 0)
return "-1";
else
//return res = str1.substr(ar[0], ar[1]);评论指出的错误,之前误记为是前闭后开,开始到结束的位置,这里substr函数正确形式为s.substr(pos, n),返回一个string,包含s中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是s.size() - pos,即不加参数会默认拷贝整个s)
return res = str1.substr(ar[0], max_len);
}
int main()
{
string str1, str2, res;
cin >> str1 >> str2;
res = func(str1, str2);
cout << res << endl;
return 0;
运行一下

不积小流无以成江河

浙公网安备 33010602011771号