C++ :: Aufgabe #347

1 Lösung Lösung öffentlich

Unikat- Liste aus zwei Zeichenketten/Sätzen

Anfänger - C++ von JKooP - 02.04.2021 um 18:13 Uhr
Gegeben sind zwei Zeichenketten (a, b) bestehend aus Kleinbuchstaben und Leerzeichen.
Es sollen die Wörter in ein neues String- Array überführt werden,
die genau einmal in beiden Zeichenketten vorkommen (Unikate).

Beispiel 1:
a = „der pfannkuchen schmeckt süß“
b = „der pfannkuchen schmeckt salzig“
Lösung: { „süß“, „salzig“ }

Beispiel 2:
a = „apfel apfel“
b = „banane“
Lösung: { „banane“ }

Beispiel 3:
a = „der pfannkuchen schmeckt“
b = „der pfannkuchen schmeckt“
Lösung: { }

Erstelle eine Methode/Funktion, die solch ein String- Array zurückgibt.

Viel Spaß

Lösungen:

vote_ok
von JKooP (18090 Punkte) - 24.05.2021 um 19:54 Uhr
C++ 17
Quellcode ausblenden C-Code
#include <iostream>
#include <vector>
#include <tuple>
#include <string>
#include <map>
using namespace std;

vector<string> string_split(const string& s, const char& del = ' ') {
    vector<string> v;
    string w = "";
    for (const auto& c : s) {
        if (c == del) {
            v.push_back(w);
            w = "";
        }
        else {
            w += c;
        }
    }
    v.push_back(w);
    return v;
}

template<typename T>
bool map_contains_key(const map<T, int>& m, const T& compare) {
    for (const auto& k : m)
        if (k.first == compare)
            return true;
    return false;
}

template<typename T>
vector<T>vector_concat(const vector<T>& v1, const vector<T>& v2) {
    vector<T>c{ v1 };
    c.insert(c.end(), v2.begin(), v2.end());
    return c;
}

vector<string> unique_words(const string& a, const string& b) {
    map<string, int>m;
    vector<string>v;

    auto concat{ vector_concat(string_split(a), string_split(b)) };

    for (const auto& i : concat) 
        if (map_contains_key(m, i)) 
            m[i]++;
        else 
            m.emplace(i, 1);

    for (const auto& i : m)
        if (i.second == 1)
            v.push_back(i.first);

    return v;
}

int main()
{
    vector<tuple<string, string>>v{
        {"der pfannkuchen schmeckt suess", "der pfannkuchen schmeckt salzig"},
        {"apfel apfel", "banane"} ,
        {"der pfannkuchen schmeckt", "der pfannkuchen schmeckt"} };

    for (const auto& i : v) {
        for (const auto& k : unique_words(get<0>(i), get<1>(i)))
            cout << k << ", ";
        cout << "\n";
    }
}