C++ feladatban segítene valaki?
Feladat:
Kérjen be egy max 1000 karakterből álló szöveget, majd írassa ki a legalább kétszer előforduló leghosszabb szövegrészletet.
Nem tudom a feladat mire gondol a leghosszabb szövegrészlet alatt, leghosszabb szóra talán?
Az a helyzet, hogy programozni nem tudok... bekérem a szöveget, de még azt se tudom, hogy írassam ki a leghosszabb szót belőle.
Valaki tudna segíteni?
Igen a leghosszabb szóra gondol szerintem is de függetlenül attól hogy ez a szó értelmes vagy értelmetlen e,ezért úgy fogd fel hogy van egy karaktersorozatod amiben meg kell keresned azt a két leghosszabb karaktersorozaton belüli karaktersorozatot amely egyforma.
A karaktersorozatod felétől ha páros a száma a karaktereket tartalmazó szövegnek ha páratlan akkor fele - 1 mert ugye egy felétől hosszabb az egyik karaktersorozatod akkor annak nem lehet egyező párja , veszed ezt a hosszúságú szövegrészt(fél ha páros) és összehasonlítod a másik felével ha nincs egyezés akkor mész tovább veszel eggyel kevesebb karaktert mind a két szórészletedből de mind a kettőnek hátulról vagy az elejéről és ha találsz egyezést eltárolod és kilépsz a ciklusból.
Valami ilyesmi logika alapján kéne megcsinálod.
#1 Te azt feltételezed, hogy a két szórészlet a szöveg két felében lesz?
Erre alapvetően van egy igen gyors megoldás, ami egyben némiképp komplikált is, szóval ragaszkodjunk az egyszerű megközelítéshez.
Az én megközelítésem a következőn alapszik: Ha van egy n hosszú karakterlánc ami megegyezik, akkor annak az összes substringje is egyezni fog, egészen az első karakterig. Tehát először elég az első karaktert megtalálni.
Először fogod a legelső karaktert, és elkezdesz végigmenni a szövegen, egészen addig, amíg nem találsz egy ugyanolyan karaktert. Eztán elkezded szépen nézni, hogy az első karakter után hány karakterig egyezik a két szövegrészlet. Ha egy ponton már nincs egyezés, akkor fogod, az addigi szövegrészletet kimásolod, mint 'leghosszabb'. Ezután mész tovább a szövegen, keresve további egyezést az első karakterrel, de mostmár ha egyezést találsz, bevethetsz egy egyszerű trükköt. Ha mondjuk n karakter hosszú az aktuális leghosszabb szövegrészlet, megnézheted, hogy az n+1. karakterhelyen egyezik-e a két szövegrészlet amit épp vizsgálsz. Ha nem, akkor kár vesződni, mehetsz tovább. Így mész végig a szövegen az első karakterre, majd a másodikra, majd a harmadikra, és így tovább, amíg el nem érsz a szöveg előtti n+1. karakterhez, ahonnan már úgysem találhatsz kellő hosszúságú egyezést. Nem túl gyors, egy szolid n^2 a műveletigénye, itt-ott optimalizálható mondjuk. Viszont relatíve egyszerű.
Köszi előző hogy rávilágítottál a hülyeségemre.
Írtad hogy lehet itt ott optimalizálni,megtennéd pls hogy elmagyarázod azt is hogy hogyan. :)
Gyorsan írtam egy megoldást:
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
int main()
{
char text[1000] = "ez egy szoveg random szavakkal ossze vissza szavakkal ossze meg vissza a szoveg";
std::vector<std::string> sections;
std::istringstream ss(text);
std::string token;
while(std::getline(ss, token, ' '))
sections.push_back(token);
int maxSize = sections[0].length();
int maxIndex = 0;
for(int i=0; i<sections.size(); i++)
{
for(int j=i; j<sections.size(); j++)
{
if(sections[i] == sections[j] && maxSize < sections[i].length())
{
maxSize = sections[i].length();
maxIndex = i;
break;
}
}
}
std::cout << sections[maxIndex] << std::endl;
return 0;
}
Nem biztos hogy a legszebb megoldás, messze nem a leghatékonyabb, de mivel írta a kérdező, hogy nem tud programozni, nem akartam bonyolítani a dolgot.
Köszönöm a válaszokat!
Utolsó küldött nekem egy megoldást, ezen kellene még csiszolni egy kicsit.
Tehát a lényeg, hogy elindul a program és fontos, hogy ne tűnjön el. Ki írja a felhasználónak, hogy írjon be egy szöveget. Entert nyom a felhasználó és a program kiválasztja a leghosszabb szót, ami legalább kétszer előfordul (ezt a szót ki is íratja a progi). Ezután egy gombnyomásra bezáródik.
Próbáltam átírni a kódot, de annyira béna vagyok, hogy nem megy.
Idáig jutottam:
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <sstream>
int main()
{
setlocale(LC_ALL, "hun");
cout << "Írjon be egy maximum 1000 karakterből álló szöveget : " << endl;
char text[1000] = "ez egy szoveg random szavakkal ossze vissza szavakkal ossze meg vissza a szoveg";
std::vector<std::string> sections;
std::istringstream ss(text);
std::string token;
while (std::getline(ss, token, ' '))
sections.push_back(token);
int maxSize = sections[0].length();
int maxIndex = 0;
for (int i = 0; i<sections.size(); i++)
{
for (int j = i; j<sections.size(); j++)
{
if (sections[i] == sections[j] && maxSize < sections[i].length())
{
maxSize = sections[i].length();
maxIndex = i;
break;
}
}
}
std::cout << sections[maxIndex] << std::endl;
system("pause");
return 0;
}
Talán a getline(cin, ); utasítást kellene használnom?
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!