两个字符串最长公共子串

给定两个字符串,找出最长公共子串,并返回该子串,如果不存在则返回-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;

 

  

 

 运行一下

 

 

 

posted @ 2020-09-15 16:14  C_hp  阅读(601)  评论(2)    收藏  举报