查找字符串中最长的子字符串

Find longest substring in a string

本文关键字:字符串 查找      更新时间:2023-10-16

我想知道如何做到这一点:

string1= "cggt"
string2="ccgg"

包含string2的最大子串string1只有一个"c"(string1必须有连续的string2段,就像string1是"ccgt"一样,那么返回应该是最大子串"cc")。

更多示例:

string1:"EggAndApple"  
string2:"AppleEggAnd"

我想在包含string2string1中找到最大子串应该是"Apple"(必须以string2开头)

但我下面的代码将给出"EggAnd"作为结果

我搜索了一些解决方案以返回结果maxsubstring是"cgg"。代码是

int findOverlap( std::string str1,  std::string str2)
    {
     if(str1.empty() || str2.empty())
     {
          return 0;
     }
     int *curr = new int [str1.size()];
     int *prev = new int [str1.size()];
     int *swap = nullptr;
     int maxSubstr = 0;
     for(int i = 0; i<str2.size(); ++i)
     {
          for(int j = 0; j<str1.size(); ++j)
          {
               if(str1[j] != str2[i])
               {
                    curr[j] = 0;
               }
               else
               {
                    if(i == 0 )
                    {
                         curr[j] = 1;
                    }
                    else
                    {
                         curr[j] = 1 + prev[j-1];
                    }
                    if(maxSubstr < curr[j])
                    {
                         maxSubstr = curr[j];
                    }
               }
          }
          swap=curr;
          curr=prev;
          prev=swap;
     }
     delete [] curr;
     delete [] prev;
     return maxSubstr;
}

如何修改此代码以满足我的要求,或者如何编写新的代码段来解决我的问题?

下面是我对您问题的修改,我没有编译和运行,但它应该可以工作。

char* str1 = "EggAndApple";
char* str2 = "AppleEggAnd";
int* maxSubStrLen = new int [strlen(str1)];
memset(maxSubStrLen, 0, sizeof(int) * strlen(str1));
// start index of max substring
int  maxGlobalSubStrIdx = -1;
// length of max substring
int  maxGlobalSubStrLen = 0;
for(int i = 0; i < strlen(str2); ++i)
{
    for(int j = i; j < strlen(str1); ++j)
    {
        if(str1[j] != str2[i])
        {
            continue;
        }
        // str1[j] == str2[i]
        {
            // find substring started from (j - i) ?
            if(maxSubStrLen[j - i] == i) {
                maxSubStrLen[j - i]++;
                if(maxGlobalSubStrLen < maxSubStrLen[j - i])
                {
                    maxGlobalSubStrLen = maxSubStrLen[j - i];
                    maxGlobalSubStrIdx = j - i;
                }
            }
        }
    }
}
delete [] maxSubStrLen;
printf("maxGlobalSubStrLen:%d, maxGlobalSubStrIdx:%dn", maxGlobalSubStrLen, maxGlobalSubStrIdx);