У меня есть 1000 строк. Учитывая шаблон, который нужно искать во всей строке, и вернуть всю строку, содержащую этот шаблон.Какая структура данных и алгоритм подходят для этого?
В настоящее время я использую вектор для хранения исходных строк. поиск шаблона, и если совпадение добавляет его в новый вектор и, наконец, возвращает вектор.
int main() {
vector <string> v;
v.push_back ("maggi");
v.push_back ("Active Baby Pants Large 9-14 Kg ");
v.push_back ("Premium Kachi Ghani Pure Mustard Oil ");
v.push_back ("maggi soup");
v.push_back ("maggi sauce");
v.push_back ("Superlite Advanced Jar");
v.push_back ("Superlite Advanced");
v.push_back ("Goldlite Advanced");
v.push_back ("Active Losorb Oil Jar");
vector <string> result;
string str = "Advanced";
for (unsigned i=0; i<v.size(); ++i)
{
size_t found = v[i].find(str);
if (found!=string::npos)
result.push_back(v[i]);
}
for (unsigned j=0; j<result.size(); ++j)
{
cout << result[j] << endl;
}
// your code goes here
return 0;
}
Есть ли оптимальный способ достижения такого же уровня сложности и меньшей производительности?
Звучит как работа для 'grep' ... – Floris
Вы можете просто сохранить индекс совпадающей строки, вместо самой строки. Таким образом, 'result' становится' vector 'сохранение только индекса. –
Mine
Вы можете обходиться с деревьями суффиксов, и вы получите более низкую асимптотическую сложность --- линейное время для создания вещи и времени, пропорционального длине строки запроса, а также количеству выходов для запроса. Тем не менее, существует довольно высокий постоянный фактор; в вашем масштабе это просто не стоит. – tmyklebu