Szybkie zadanie maturalne - prefiks palindrom

0

Witam,
mam problem z jednym zadanie o nazwie Prefiks Palindrom (c++). Jego polecenie brzmi: Napis t jest prefiksem napisu s, jeśli istnieje taki napis y, że s=ty (czyli s jest złączeniem, inaczej mówiąc konkatenacją napisów t i y). Przy czym y może być słowem o zerowym rozmiarze. Napisz program, który dla podanego napisu znajdzie możliwie najdłuższy prefiks który jest palindromem.
Tak więc dla wyrazu obok odpowiedzią będzie 3, dla wyrazu obobok - 5, a dla wyrazu stok - 1.
Mój program działa tylko w wypadku, gdy literki się nie pokrywają, tj. dla powyższych przykładów będzie działał, ale już dla oboko naliczy z jakiegoś powodu 7...
Proszę o pomoc.

#include <iostream>
#include <string>
using namespace std;
int main()
{
int wynik=0;
string s;
cin>>s;
for (int j=s.size()-1; j>0; j--)
{
for (int i=0; i<s.size(); i++)
{
if (s[j]==s[i]) wynik++;
else break;
}
}
wynik=2*wynik;
wynik++;
cout<<wynik;
return 0;
}
0

Moim zdaniem źle się do tego zabrałeś, ja bym poszukał wszystkich wystąpień pierwszej litery słowa, i sprawdzał czy tak uzyskany ciąg jest palindromem.

0

Drugą pętlę odpalaj tylko jeśli w pierwszej dostałeś "trafienie" i ja bym do sprawdzania "czy pali" użył while-a. Swoją drogą już konieczność mnożenia wyniku przez 2 powinna uruchomić wszelkie możliwe dzwonki alarmowe w twojej głowie. Bo co jeśli dostaniesz słowo okoń? prawidłowa odpowiedź to 3, czyli z pętli musiało by wyjść 1,5. Zresztą maszt funkcję sprawdzającą czy to palindrom.

bool czypali(string slowo, int kon)
{
    int pocz = 0;
    while (pocz < kon)
    {
        if (slowo[pocz] != slowo[kon]) return false;
        pocz++;
        kon--;
    }
    return true;
}
0
#include <iostream>
#include <string>

using namespace std;

bool czypali(string slowo, int kon)
{
    int pocz = 1;
    while (pocz < kon)
    {
        if (slowo[pocz] != slowo[kon]) return false;
        pocz++;
        kon--;
    }
    return true;
}

void sprawdz(string slowo)
{
    for (int i = (slowo.size() - 1); i > 0; i--)
    {
        if (slowo[i] == slowo[0])
            if (czypali(slowo, i - 1))
            {
                cout << i + 1 << "\n";
                return;
            }
    }
    cout << "1\n";
    return;
}


int main()
{
sprawdz("obok");
sprawdz("obobok");
sprawdz("stok");
return 0;

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1