求两个串中的第一个最长子串

来源:互联网 发布:c语言中volatile byte 编辑:程序博客网 时间:2024/04/30 04:29

题目:求两个串中的第一个最长子串(神州数码以前试题)。如"abractyeyt","dgdsaeactyey"的最大子串为"actyey"。


#include <iostream>

#include <string>


using namespace std;


//两个串中的第一个最长子串
string FindLongestCommonSubString(string strOne, string strTwo)
{
    if ("" == strOne || strOne.length() <= 0 || "" == strTwo || strTwo.length() <= 0)
    {
        return NULL;
    }
    if (strOne.length() < strTwo.length())  //strOne始终是最长的, 相当于母串,strTwo相当于子串
    {
        string strTmp = strOne;
        strOne = strTwo;
        strTwo = strTmp;
    }
    int *mask = new int[strOne.length()];
    int maxlength = 0;
    int end = -1;
    memset(mask, 0, sizeof(int)*strOne.length());
    for (int i = 0; i < strTwo.length(); i++)
    {
        for (int j = strOne.length() - 1; j >= 0; j--)
        {    
            if (strTwo[i] == strOne[j])
            {
                if (i == 0 || j == 0)
                {
                    mask[j] = 1; //母串为第一个元素,或者子串只有一个元素
                }
                else
                {
                    mask[j] = mask[j - 1] + 1;
                }
            }
            else
            {
                mask[j] = 0;
            }
            if (mask[j] > maxlength)
            {
                maxlength = mask[j];
                end = j;
            }
        }
    }
    delete [] mask;
    return strOne.substr(end - maxlength + 1, maxlength);
}


int main()
{
    string strOne = "abractyeyt";
    string strTwo = "dgdsaeactyey";
    cout<<"第一个字符串: "<<strOne<<endl;
    cout<<"第二个字符串: "<<strTwo<<endl;
    cout<<"最长公共子串: "<<FindLongestCommonSubString(strOne, strTwo);


    cout<<endl;
    return 0;
}