Найти самую длинную подстроку в строке

0

Я хотел бы знать, как это сделать:

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;
}

Как изменить этот код для удовлетворения моих требований или как написать новый сегмент кода для решения моей проблемы?

  • 1
    Для какого класса это?
  • 3
    Для «cggt» и «ccgg» максимальная подстрока равна 3, а не 1 («cgg» содержится в обеих строках). Я не очень понимаю, чего вы пытаетесь достичь, не могли бы вы привести еще несколько примеров для подстрок?
Показать ещё 2 комментария
Теги:
string
algorithm

1 ответ

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);
  • 0
    Я проверял это в VS2012, он не работает. строка maxSubStrLen [j - i] не инициируется, поэтому maxSubStrLen [j - i] == i может никогда не быть истинным.
  • 0
    Немного обновить вышеуказанный исходный код: memset инициализировать весь массив как ноль; б. проверка границ, чтобы убедиться, что (j - i) не отрицательно. Пожалуйста, проверьте мой исходный код обновления, который выдает правильный результат: "maxGlobalSubStrLen: 5, maxGlobalSubStrIdx: 6"
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню