C++ :: Aufgabe #358

1 Lösung Lösung öffentlich

Noch mehr Mustervergleiche (word pattern)

Fortgeschrittener - C++ von JKooP - 17.04.2021 um 19:10 Uhr
Gegeben ist ein Text (String), der ausschließlich aus kleingeschriebenen Wörtern besteht,
welche durch Leerzeichen getrennt sind.
Weiterhin gibt es eine Sequenz (String) mit der der Text verglichen werden soll (Mustergleichheit).

Beispiele:
t = "hund katze katze hund"
s = "abba"
Lösung: wahr => a = hund; b = katze; b = katze; a = hund

t = "hund katze maus hund"
s = "abba"
Lösung: falsch => a = hund; b = katze; b = maus; a = hund (b ist unterschiedlich)

t = "hund hund hund hund"
s = "aaa"
Lösung: falsch => Anzahl stimmt nicht überein

Schreibe eine Methode/Funktion, mit der man die Mustergleichheit überprüfen kann.
Als fakultative Herausforderung: ohne die implementierten Funktionen wie etwa Dictionary, map, set, zip, etc.

Viel Spaß

Lösungen:

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

vector<char> string_to_vector(string& s) {
    vector<char> v;
    for (const auto& c : s) 
        v.push_back(c);
    return v;
}   

vector<string> string_split(string& s, 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>
int get_index(vector<T> v, T c) {
    auto it{ find(v.begin(), v.end(), c) };
    if (it != v.end())
        return it - v.begin();
    return -1;
}

bool word_pattern(string p, string s) {
    vector<string> vp{ string_split(p) };
    vector<char> vs{ string_to_vector(s) };

    if (vp.size() != vs.size()) return false;

    for (size_t i = 0; i < vp.size(); i++)
        if(get_index(vs, vs[i]) != get_index(vp, vp[i]))
            return false;
    return true;
}

int main()
{
    string pat{ "hund katze katze hund" };
    string str{ "abba" };
    std::cout << "Das Muster ist " << (word_pattern(pat, str) ? "" : "un") << "gleich!\n";
}