C++ цикл while и алгоритм поиска, дубликаты

avatar
SeePlus
7 апреля 2018 в 23:10
149
1
-1
for (int j = 0; j < messageVector.size(); j++)
{
    for (int i = 0; i < bookVector.size(); i++)
    {
        size_t offset = 0;
        while ((offset = bookVector[i].find(messageVector[j], offset)) != string::npos)
        {
                cout << "Found " << messageVector[j] << " at " << i << "," << offset << std::endl;
                ++offset;
        }
    }
}

проблема, с которой я столкнулся с этим кодом, заключается в том, что если вектор книги содержит повторяющуюся букву, буква будет напечатана оба раза с обеих позиций. поэтому, если messageVector содержит сообщение «тест», а bookvector содержит алфавит с дополнительной буквой t, вывод будет таким: найдено t в точке i, смещено два раза, а затем остальная часть сообщения. Это не обязательно проблема, но я бы хотел, чтобы повторяющиеся буквы печатались только один раз со случайным набором координат, где был выбран t.

Я думал о способе решения проблемы, я в основном сделал это в псевдокоде, я собирался получить все строки и смещения, которые имеют один и тот же символ, поместить их в контейнер, выбрать случайный. выводим найденные позиции в консоль с персонажем, очищаем контейнер и переходим к следующей букве и делаем все заново. Однако я не знаю, где это сделать в цикле while. Было бы здорово, если бы кто-нибудь помог мне пройти через это.

Источник
atrelinski
7 апреля 2018 в 23:35
0

Допустимо ли решение, когда вы заменяете тип с std::vector на std::set для переменной bookVector? Set автоматически удалит дубликаты для вас.

SeePlus
8 апреля 2018 в 00:43
0

да, я просто не использовал наборы, поэтому я не

Ответы (1)

avatar
Ricardo
7 апреля 2018 в 23:25
-1

Я не очень хорошо понял проблему, но я думаю, что это решение.

for (int j = 0; j < messageVector.size(); j++){
  for (int i = 0; i < bookVector.size(); i++){
    bool duplicateL = false;

    size_t offset = 0;
    while (((offset = bookVector[i].find(messageVector[j], offset)) != string::npos) && (duplicateL == false)){
      cout << "Found " << messageVector[j] << " at " << i << "," << offset << std::endl;
      ++offset;
      duplicateL = true;
    }
  }
}

Дополнительная переменная, чтобы узнать, первый раз или нет.