Anagramme finden / Map Zugriff



  • Halle Leute,
    ich mache grad ein kleines Programm das von einem eingegebenen Text alle Anagramme findet und die Wörter ausgibt. Klappt auch soweit ganz gut, aber ich schaffe es einfach nicht das er mir NUR die Anagramme ausgibt, sondern er gibt auch alle einzelnen Wörter aus die keine Anagramme haben. Hier mal mein Code bisher:

    int main(int argc, char *argv[])
    {
     using namespace std;
    
      typedef map< string, string > map;
    
       map m;
    
      while( !cin.eof() )
      {
             string s;
             string v;
             cin >> s ;
    
             transform(s.begin(), s.end(), s.begin(), ::tolower);
    
             v=s;
    
             stable_sort(s.begin(), s.end()); 
    
             if( !cin.eof() )
    
          m[s] += v;
          m[s] += " ";
    
       } 
    
       for( map::iterator i = m.begin();
       i != m.end(); ++i)
       {
    
         cout << i->second << " " << endl;   
    
       }
    
         getchar();
    
         return 0;
    }
    

    ich brauche da sicher ne Schleife oder so das nur die ausgegeben werden die mehr als 2 werte haben, aber irgendwie komm ich nciht drauf wo und wie und mehrere Versuche scheiterten bereits.

    Hoffe jemand kann mir helfen, bin noch Anfänger 😉

    Gruß
    Emperor



  • Hallo TheEmperor,

    willkommen im C++-Forum.

    zu Deinem Problem: wenn Du nur die Wörter haben möchtest, für die Anagramme gibt, so musst Du nach Ende der Eingabe bzw. bei bei der Ausgabe feststellen, ob Du zu einem Schlüssel mehr als ein Wort hinterlegt hast.

    Das wiederum geht einfacher, wenn Du statt des Aneinanderreihens der Wörter einen eigenen Container benutzt.
    Also

    typedef map< string, vector< string > > map;
    

    und dann in Zeile 26

    m[s].push_back( v );
    

    Zeile 27 kann man dann weglassen. Und ab Zeile 33 geht es dann so weiter

    for( map::iterator i = m.begin();
            i != m.end(); ++i)
        {
            if( i->second.size() > 1 ) // Anagramme vorhanden?
            {
                copy( i->second.begin(), i->second.end(), ostream_iterator< string >( cout, " " ) );
                cout << endl;
            }
        }
    

    Du benötigst dazu noch die includes <iterator> und <vector>.

    Gruß
    Werner



  • hat funktioniert...hatte mir sowas schon gedacht (hatte es vorher schonmal mit nem set versucht statt vector), aber die umsetzung hat nicht ganz geklappt 😉

    Vielen Dank


Log in to reply