我想知道如何做到这一点:
string1= "cggt"
string2="ccgg"
包含string1
的最大子字符串string2
只有一个“c”(string1
必须有string2
段,如果string1
是“ccgt”,然后返回应该是maxsubstring“cc”)。
更多示例:
string1:"EggAndApple"
string2:"AppleEggAnd"
我想找到string1
中包含string2
的最大子字符串应该是“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;
}
如何修改此代码以满足我的要求或如何编写新的代码段来解决我的问题?
答案 0 :(得分:1)
以下是我对你的问题的修改,我没有编译和运行,但它应该有效。
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:%d\n", maxGlobalSubStrLen, maxGlobalSubStrIdx);