Grade 10 · Character stringsCitește în română

Palindrome words in a sentence

Original: Cuvintele palindrom dintr-o frază

O(n)C++1756 lines2 examples

The idea

We combine two things learned before: strtok splits the sentence into words, and the function estePalindrom(p) checks a word with two indices moving in from both ends. The palindrome words are printed in the order they appear, or NU EXISTA (none) if there are none.

Original description (Romanian)

Combinăm două lucruri învățate: strtok împarte fraza în cuvinte, iar funcția estePalindrom(p) verifică un cuvânt cu doi indici care se apropie dinspre capete. Se afișează cuvintele palindrom în ordinea în care apar sau NU EXISTA dacă nu este niciunul.

Complexity
O(L)
Grade
Grade 10 (Clasa a X-a)

Examples

Example 1

Input

ana are un capac si o cojoc rosu

Expected output

ana capac o cojoc
Example 2

Input

ploua de azi

Expected output

NU EXISTA

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

cuvinte-palindrom.cpp
/*
 * Titlu: Cuvintele palindrom dintr-o frază
 * Clasa: 10
 * Capitol: Șiruri de caractere
 * Descriere: Combinăm două lucruri învățate: strtok împarte fraza în cuvinte, iar
 *            funcția estePalindrom(p) verifică un cuvânt cu doi indici care se
 *            apropie dinspre capete. Se afișează cuvintele palindrom în ordinea în
 *            care apar sau NU EXISTA dacă nu este niciunul.
 * Complexitate: O(L)
 *
 * Exemplu
 * Intrare: ana are un capac si o cojoc rosu
 * Ieșire: ana capac o cojoc
 *
 * Exemplu
 * Intrare: ploua de azi
 * Ieșire: NU EXISTA
 */
#include <iostream>
#include <cstring>
using namespace std;

bool estePalindrom(char p[])
{
    int st = 0, dr = strlen(p) - 1;
    while (st < dr)
    {
        if (p[st] != p[dr])
            return false;
        st++;
        dr--;
    }
    return true;
}

int main()
{
    char s[256];
    cin.getline(s, 256);
    bool gasit = false;
    char *p = strtok(s, " ,.!?");
    while (p != NULL)
    {
        if (estePalindrom(p))
        {
            cout << p << ' ';
            gasit = true;
        }
        p = strtok(NULL, " ,.!?");
    }
    if (!gasit)
        cout << "NU EXISTA";
    cout << '\n';
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.