Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- void Unos(char *& string)
- //unos stringova
- {
- char buffer[255];
- cin.getline(buffer, 255);
- int vel = strlen(buffer) + 1;
- string = new char[vel];
- strcpy_s(string, vel, buffer);
- }
- void Dealociraj(char ** svi, int trenutno)
- {
- for (int i = 0;i < trenutno;i++)
- {
- delete[] svi[i];
- }
- delete[]svi;
- svi = nullptr;
- }
- bool strstr2(char ** svi, int max,char * znak)
- //slicno na principu funkcije strzachr u zelji da manje opteretim funkciju duzina najveceg uveo sam ovu funkciju koja ce provjeravati da li trenutni
- //sadrzaj buffera posjeduju svi stringovi
- {
- bool ima = false;
- for (int i = 0;i < max;i++)
- {
- if (svi[i] != '\0' && strlen(znak)<strlen(svi[i]))
- {
- if (strstr(svi[i], znak) != nullptr)
- ima = true;
- else
- {
- ima = false;
- break;
- }
- }
- }
- return ima;
- }
- bool strzachr(char ** svi, int max, char znak)
- //za manje opterecivanje funkcije duzina najveceg kako ne bi uvodio jos jednu for petlju bespotrebno uvedena je ova funkcija,provjerava da li postoji
- //znak u svim stringovima
- {
- bool ima = false;
- for (int i = 0;i < max;i++)
- {
- if (strchr(svi[i],znak) != nullptr)
- ima = true;
- else
- {
- ima = false;
- break;
- }
- }
- return ima;
- }
- char * vratijedankarakter(char znak)
- //kod slucajeva kada pronadje samo jedno slovo funkcija strcpy_s u funkciji unesisub nije bas pozitivno nastrojena prema jednom karakteru pa je bilo
- //neophodno pronaci nacin za kreiranje niza od jednog karaktera s obzirom da nisam zelio napraviti jos jedan overload funkcije unesisub jer je bilo bespotrebno
- //tako da sam s ovom funkcijom rijesio problem.Svakako sam probao preko template<typename T> pa da razlikujem niz karaktera i karakter jedan
- //ali jos uvijek se strcpy_s bunio pa sam odustao od tog rjesenja
- {
- char * buffer = new char[1 + 1];
- buffer[0] = znak;
- buffer[1] = '\0';
- return buffer;
- }
- char ** unesisub(char * unos,int trenutno,char ** svi)
- //sluzi za pohranjivanje substringova zbog kasnije pretrage mada je mozda bilo moguce dodati neki parametar u glavnoj funkciji duzinanajveceg
- //koji bi odma izracunavao duzinu i uporedjivao sa prethodnim substringovima ali ja sam ovako implementirao
- {
- int vel = 0;
- char ** temp = new char *[trenutno + 1];
- for (int i = 0;i < trenutno;i++)
- {
- temp[i] = new char[strlen(svi[i]) + 1];
- strcpy_s(temp[i], strlen(svi[i]) + 1, svi[i]);
- delete[] svi[i];
- }
- vel = strlen(unos);
- temp[trenutno] = new char[vel + 1];
- strcpy_s(temp[trenutno], vel+1,(unos));
- delete[]svi;
- svi = temp;
- return temp;
- }
- int nadjiduzinu(char ** subovi, int trenutnosubova)//pronalazak duzine najduzeg substringa
- {
- size_t max = strlen(subovi[0]);
- for (int i = 1;i < trenutnosubova;i++)
- {
- if (strlen(subovi[i]) > max)
- max = strlen(subovi[i]);
- }
- return max;
- }
- int nadjipoziciju(char ** subovi, int trenutnosubova)//sluzi za nalazenje pozicije najduzeg stringa s obzirom da on ima najvise slova za pretragu
- {
- size_t max = strlen(subovi[0]);
- int pozicja = 0;
- for (int i = 1;i < trenutnosubova;i++)
- {
- if (strlen(subovi[i]) > max)
- {
- max = strlen(subovi[i]);
- pozicja = i;
- }
- }
- return pozicja;
- }
- int duzinanajveceg(char ** stringovi, int max)
- {
- int pozicijanajduzeg = nadjipoziciju(stringovi, max);
- int brojacsubova = 0;
- char ** subovi = nullptr;
- char * karakter = nullptr;
- for (size_t j = 0;j < strlen(stringovi[pozicijanajduzeg]);j++)
- if (strzachr(stringovi, max, stringovi[pozicijanajduzeg][j]))
- {
- bool dalje = true;
- karakter = vratijedankarakter(stringovi[pozicijanajduzeg][j]);
- subovi = unesisub(karakter, brojacsubova++, subovi);
- int brojackaraktera = 1;
- while (dalje)
- {
- dalje = false;
- brojackaraktera++;
- char * buffer = new char[brojackaraktera + 1];
- for (int k = 0;k < brojackaraktera;k++)
- {
- if (stringovi[pozicijanajduzeg][j + k] != '\0')
- {
- buffer[k] = stringovi[pozicijanajduzeg][j + k];
- }
- else
- break;
- }
- buffer[brojackaraktera] = '\0';
- if (strstr2(stringovi, max, buffer))
- {
- subovi = unesisub(buffer, brojacsubova++, subovi);
- delete[]buffer;
- dalje = true;
- }
- else
- {
- delete[] buffer; dalje = false;
- }
- }
- }
- if (brojacsubova == 0)
- return 0;
- int velicina = nadjiduzinu(subovi, brojacsubova);
- Dealociraj(subovi, brojacsubova);
- return velicina;
- }
- int main()
- {
- char nastavak;
- do {
- int izbor = 0;
- do {
- cout << "Unesite broj stringova " << endl;
- cin >> izbor;
- } while (izbor < 1);
- cin.ignore();
- char ** stringovi = new char *[izbor];
- for (int i = 0;i < izbor;i++)
- {
- cout << i + 1 << ". string -> ";
- Unos(stringovi[i]);
- }
- cout << "duzina najveceg substringa je -> " << duzinanajveceg(stringovi, izbor);
- cout << endl << endl << endl << endl <<"ponovo ? (y/n)" << endl;
- cin >> nastavak;
- Dealociraj(stringovi, izbor);
- system("cls");
- } while (nastavak != 'n');
- cout << "hvala na testiranju :)" << endl;
- system("pause>0");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement