Я хотел бы знать, как это сделать:
string1= "cggt"
string2="ccgg"
Макс подстроки string1
содержит string2
только один "с" (string1
должны продолжать string2
сегменты, как если string1
является "CCGT", а затем вернитесь следует maxsubstring "сс").
Еще пример:
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;
}
Как изменить этот код для удовлетворения моих требований или как написать новый сегмент кода для решения моей проблемы?
Ниже приведено мое изменение для вашего вопроса, я не компилировал и не запускал, но он должен работать.
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);