2016-07-15 4 views
-3

У меня есть другой тип строки, и мне нужно найти дубликат записи в этой строке. Различные типы строкиНайти повторяющуюся запись в строке в C++

string aStr= "1.1,1.2,1.3, 1"; //output should be duplicate entry 
string aStr= "1.1,1.2,1.3"; //Ouput NO duplicate entry 
string aStr= "1,2,1"; //o/p duplicate entry 
string aStr = "1,2,3";//output No duplicate 

I have tried as 
std::vector <std::string> aOutString; 
std::set <int> full_list; 
std::set <std::string> aEntryInDouble; 
int aNum1; 
boost::split(aOutString, aStr , boost::is_any_of(",")); 
for(size_t it = 0; it < aOutString.size(); ++it) 
{ 
if (aOutString[it].find('.') != std::string::npos) 
{ 
//If entry is like "1.1,1.2,1.3" 
    if(!aEntryInDouble.insert(aOutString[it]).second) 
    { 
    aDup = false; 
    break; 
    } 
} 
else 
{ 
//For entry "1,2,1" 
aNum1 = std::atoi(aOutString[it].c_str()); 
if(aNum1) 
{ 
if(!full_list.insert(aNum1).second) 
{ 
aDup = false; 
break; 
} 
} 
  1. Я не смог найти решение для входа строки «строка ASTR =„1.1,1.2,1.3, 1“; Пожалуйста, помогите мне найти решение.

Спасибо,

+0

Что делает вас неспособным? С какой проблемой вы столкнулись? –

+0

Почему вы обрабатываете '.' явно? Алгоритм кажется простым: разбивается на запятые. Создайте набор из списка разделов. Если длина набора равна длине списка расщепления, то нет обмана. – erip

+0

Поместите здесь текст задачи, пожалуйста. Например, определите «дубликат». – Les

ответ

1

Вот алгоритм:.

Split вход на запятые Вы будете создавать список everythin g, который разделен запятой. Затем вы создадите набор из списка, который может содержать дубликаты. Это позволит удалить все дубликаты для вас. Если длина списка равна длине набора, дубликатов нет. В противном случае, построение набора удаленных дубликатов и короче, чем список.


Вот код на C++. Я взял токенизу от this answer и сделал несколько изменений. Кроме того, вот coliru.

#include <iostream> 
#include <vector> 
#include <string> 
#include <unordered_set> 

std::vector<std::string> split(const std::string& str, const std::string& delimiters = ",") { 
    std::vector<std::string> tokens; 

    // Skip delimiters at beginning. 
    auto lastPos = str.find_first_not_of(delimiters, 0); 
    // Find first "non-delimiter". 
    auto pos = str.find_first_of(delimiters, lastPos); 

    while(std::string::npos != pos || std::string::npos != lastPos) { 
     // Found a token, add it to the vector. 
     tokens.push_back(str.substr(lastPos, pos - lastPos)); 
     // Skip delimiters. Note the "not_of" 
     lastPos = str.find_first_not_of(delimiters, pos); 
     // Find next "non-delimiter" 
     pos = str.find_first_of(delimiters, lastPos); 
    } 

    return tokens; 
} 

bool has_dupes(const std::vector<std::string>& v) { 
    std::unordered_set<std::string> s(v.cbegin(), v.cend()); 
    return s.size() != v.size(); 
} 

std::string detect_duplicates(const std::string& s) { 
    auto v = split(s); 
    return has_dupes(v) ? "duplicates" : "no duplicates"; 
} 

int main() { 
    // dupes 
    std::string dupes = "1,2,3,4,1"; 
    std::cout << detect_duplicates(dupes) << '\n'; 

    // no dupes 
    std::string no_dupes = "1,2,3"; 
    std::cout << detect_duplicates(no_dupes) << '\n';   
} 
+0

Он работает во всех сценариях, но он не работает в std :: string dupes = "1.1.2.1,3,4,1"; эта строка тоже дубликат. – CrazyCoder

+1

@CrazyCoder Эта строка не имеет дубликатов. 1.1, 2.1, 3, 4 и 1 - все разные числа ... – erip