<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[zeichenkette erkennen und zyklusfolge ausgeben]]></title><description><![CDATA[<p>Hallo Leute, ich hoffe ihr könnt mir bei folgender Aufgabe helfen, ich blick da echt nicht mehr durch...</p>
<p>Schreiben Sie eine Funktion, die prüft, ob eine eingegebene Zeichenkette aus einer zyklischen Aufeinanderfolge einer Teilzeichenkette besteht, gegebenenfalls die (minimale) Zykluslänge bestimmt und an die aufrufende Funktion retourniert z.B.:<br />
Eingabe: abcabca Ausgabe: Zykluslänge 3<br />
Eingabe: abcabcd Ausgabe: nicht zyklisch</p>
<p>danke schon mal im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277994/zeichenkette-erkennen-und-zyklusfolge-ausgeben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 15:35:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277994.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Nov 2010 22:40:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sat, 27 Nov 2010 22:40:03 GMT]]></title><description><![CDATA[<p>Hallo Leute, ich hoffe ihr könnt mir bei folgender Aufgabe helfen, ich blick da echt nicht mehr durch...</p>
<p>Schreiben Sie eine Funktion, die prüft, ob eine eingegebene Zeichenkette aus einer zyklischen Aufeinanderfolge einer Teilzeichenkette besteht, gegebenenfalls die (minimale) Zykluslänge bestimmt und an die aufrufende Funktion retourniert z.B.:<br />
Eingabe: abcabca Ausgabe: Zykluslänge 3<br />
Eingabe: abcabcd Ausgabe: nicht zyklisch</p>
<p>danke schon mal im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986881</guid><dc:creator><![CDATA[Donniiiii]]></dc:creator><pubDate>Sat, 27 Nov 2010 22:40:03 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sat, 27 Nov 2010 22:44:47 GMT]]></title><description><![CDATA[<p>Wie sieht denn dein Ansatz aus? Was hast du bisher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986884</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 27 Nov 2010 22:44:47 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sat, 27 Nov 2010 23:01:50 GMT]]></title><description><![CDATA[<p>Ein Algorithmus, der in $$\mathcal{O}(n^2)$$ abläuft (und daher subobtimal ist) wäre die Zykluslänge 1 auszuprobieren, dann mit 2, dann mit 3, usw. bis mit n. Sobald eine Übereinstimmung gefunden wurde, gib sie aus, bei keiner ist die Zeichenkette nicht zyklisch.</p>
<p>Besser wäre vermutlich, den ersten Buchstaben zu suchen und dort kleine Substrings zu starten. Dann weiter mit dem zweiten Buchstaben und alle Substrings, die eine Abweichung aufzeigen, verwirfst du. Sobald die Ursprungsfolge eine andere erreicht, kannst du Bilanz ziehen. IMHO geht das in $$\mathcal{O}(n)$$.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986889</guid><dc:creator><![CDATA[Ansetzer]]></dc:creator><pubDate>Sat, 27 Nov 2010 23:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sat, 27 Nov 2010 23:13:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;algorithm&gt; // std::min
#include &lt;algorithm&gt; // find
#include &lt;iostream&gt;
#include &lt;string&gt;

int zykluslaenge( const std::string&amp; txt ) 
{
    if( txt.empty() )
        return -1;
    char first = *txt.begin();
    for( std::string::const_iterator i = find( txt.begin() + 1, txt.end(), first ); i != txt.end(); i = find( i + 1, txt.end(), first ) )
    {
        bool zyklus = true;
        int zl = i - txt.begin();
        for( int start = zl; start &lt; int(txt.length()); start += zl )
        {
            int len = std::min( zl, int(txt.length() - start) );
            if( txt.substr( start, len ) != txt.substr( 0, len ) )
            {
                zyklus = false;
                break;
            }
        }
        if( zyklus )
            return zl;
    }
    return -1;
}

int main()
{
    using namespace std;
    cout &lt;&lt; &quot;geben Sie eine Zeichenfolge ein (Ende mit 'q')&quot; &lt;&lt; endl;
    for( string text; cout &lt;&lt; &quot;Eingabe: &quot;, cin &gt;&gt; text &amp;&amp; text != &quot;q&quot;; )
    {
        int zl = zykluslaenge( text );
        if( zl &lt; 0 ) cout &lt;&lt; &quot;nicht zyklisch &quot;;
        else cout &lt;&lt; &quot;Zykluslaenge &quot; &lt;&lt; zl;
        cout &lt;&lt; endl;
    }
    return 0;
}
</code></pre>
<p>so ?</p>
<pre><code>geben Sie eine Zeichenfolge ein (Ende mit 'q')
Eingabe: abcabca
Zykluslaenge 3
Eingabe: abcabcd
nicht zyklisch
Eingabe: abcaabcab
Zykluslaenge 7
Eingabe: abcaabcaa
Zykluslaenge 4
Eingabe: abcd
nicht zyklisch
Eingabe: q
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986891</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 27 Nov 2010 23:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sun, 28 Nov 2010 00:28:36 GMT]]></title><description><![CDATA[<p>Ich wuerde jeden Buchstaben zaehlen und aus der Verteilung ablesen, welche Zykluslaengen in Frage kommt. Und aus diesen dann weiter aussortieren. Sie muss z.B. ein Teiler der Laenge des Strings sein.</p>
<p>abaccabacc... mag die Verteilung a<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f171.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--b_button_blood_type_"
      title=":b:"
      alt="🅱"
    />c = 200<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4af.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--hundred_points"
      title=":100:"
      alt="💯"
    />200 sein und der String 500 lang. Mit dem groessten gemeinsamen Teiler 100 aller drei Zahlen und erhaelt 2:1:2 (Zyklus 5). Nun kann man anfangen durchzuprobieren. Dabei brauchen nur solche getestet werden, deren Zykluslaenge ein Teiler von 500 ist. Z.b ist 6:3:6 mit Laenge 15 kein Zyklus, da 15 kein Teiler von 500 ist.</p>
<p>Edit: Ich habe nicht gesehen, dass der letzte Zyklus auch unvollstaendig sein kann. Dann hilft dir der Teilertrick nichts, und du musst alle moeglichen Zykluslaengen testen.</p>
<blockquote>
<p>Besser wäre vermutlich, den ersten Buchstaben zu suchen und dort kleine Substrings zu starten. Dann weiter mit dem zweiten Buchstaben und alle Substrings, die eine Abweichung aufzeigen, verwirfst du. Sobald die Ursprungsfolge eine andere erreicht, kannst du Bilanz ziehen. IMHO geht das in O(n)</p>
</blockquote>
<p>Und wenn man sehr lange Strings hat ... diese Variante wuerde wahrscheinlich sehr viel Speicher fressen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986892</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sun, 28 Nov 2010 00:28:36 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sun, 28 Nov 2010 01:44:19 GMT]]></title><description><![CDATA[<p>Ihr macht's euch ja ganz schön umständlich.</p>
<p>Ich scheue mich, ohne erbrachte Eigenleistung des Threaderstellers hier eine Lösung reinzustellen, aber eigentlich ist das ein ziemlich simples Problem, wenn man den Modulo-Operator kennt. Iteratoren und Substrings scheinen mir ziemlich große Kanonen für ziemlich kleine Spatzen.</p>
<p>Übrigens lässt sich Ansetzers Ansatz leicht zu O(n) runterdrücken, wenn man sich klarmacht, dass man, wenn man etwa einen Zyklus der Länge 4 prüft und am 9ten Zeichen feststellt, dass dieser nicht hält, Zyklen der Längen 5-8 nicht mehr prüfen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986911</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 28 Nov 2010 01:44:19 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sun, 28 Nov 2010 01:57:21 GMT]]></title><description><![CDATA[<p>Nachtrag: Ich habe mit mit der O(n)-Geschichte geirrt, mea culpa. &quot;aabaaaba&quot; hat mich da kalt erwischt.</p>
<p>Also, O(n * f(n)), mit O(f(n)) &lt; O(n). Trotzdem ist das mit Modulo deutlich einfacher zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986912</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 28 Nov 2010 01:57:21 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sun, 28 Nov 2010 11:02:30 GMT]]></title><description><![CDATA[<p>@seldon: Was machst du mit der Folge &quot;abcdefg&quot;?<br />
Also O(n·f(n)), mit O(f(n)) ≤ O(n) und somit im schlechtesten Fall O(n²). Hat nichts gebracht.</p>
<p>Mein zweiter Ansatz wird übrigens nicht mit <code>substring()</code> gemacht (auch wenn das so herüberkommt), sondern ich habe eher an <code>std::vector&lt;std::string::iterator&gt;</code> gedacht. Im Grossen und Ganzen entspricht er der Umsetzung Werner Salomon, nur ist er etwas zeitoptimierter (O(n) anstatt O(n²)) benötigt dafür jedoch er mehr Speicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986961</guid><dc:creator><![CDATA[Ansetzer]]></dc:creator><pubDate>Sun, 28 Nov 2010 11:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sun, 28 Nov 2010 13:46:51 GMT]]></title><description><![CDATA[<p>Ansetzer schrieb:</p>
<blockquote>
<p>@seldon: Was machst du mit der Folge &quot;abcdefg&quot;?<br />
Also O(n·f(n)), mit O(f(n)) ≤ O(n) und somit im schlechtesten Fall O(n²). Hat nichts gebracht.</p>
<p>Mein zweiter Ansatz wird übrigens nicht mit <code>substring()</code> gemacht (auch wenn das so herüberkommt), sondern ich habe eher an <code>std::vector&lt;std::string::iterator&gt;</code> gedacht. Im Grossen und Ganzen entspricht er der Umsetzung Werner Salomon, nur ist er etwas zeitoptimierter (O(n) anstatt O(n²)) benötigt dafür jedoch er mehr Speicher.</p>
</blockquote>
<p>Im Fall von &quot;abcdefg&quot; muss ich für jede Zyklenlänge nur ein Zeichen prüfen, um festzustellen, dass der Zyklus nicht hält, und kriege dementsprechend O(n). Interessanter ist der Fall &quot;aaaaaaaaaab&quot;, in dem es bei völlig naiver Implementation tatsächlich auf O(n²) hinausliefe (allerdings nicht bei mir), oder pathologische Fälle wie &quot;aaabaaaaaaaaaaaaabaaaaaaaaaaaaabaaaaa&quot;, in denen ich auch keinen einfachen Weg zu O(n) sehe.</p>
<p>Vielleicht ließe sich mit Boyer-Moore-artigen Tricks etwas drehen, die Laufzeitkomplexität zu drücken, aber das auszuklamüsern ist mir hierfür entschieden zu viel Arbeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1987041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1987041</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 28 Nov 2010 13:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sun, 28 Nov 2010 17:20:05 GMT]]></title><description><![CDATA[<p>Danke euch leute, für die antworten und dass ihr mir dabei helft <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>nun ja mit den ansätzen sieht es bei mir nicht gut aus. ich bin programmieranfänger und bin bei der aufgabe echt verzweifelt...</p>
<p>die lösung von Werner stimp zwar, aber damit kann ich auch nichts anfangen, weil das viel zu kompliziert gelöst ist... kann man das nicht auch einfacher ausführen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1987120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1987120</guid><dc:creator><![CDATA[Donniiiii]]></dc:creator><pubDate>Sun, 28 Nov 2010 17:20:05 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sun, 28 Nov 2010 18:15:24 GMT]]></title><description><![CDATA[<p>Mache dir doch bitte selbst mal Gedanken. Welche schritte musst du mache? Das ganze zu Programmieren kommt erst am Ende.</p>
<p>Wie wuerdest du auf Zykluslaenge 1 testen?<br />
Wie wuerdest du auf Zykluslaenge 2 testen?<br />
Wie wuerdest du auf Zykluslaenge 3 testen?</p>
<p>... kann man das dann verallgemeinern? Wie?</p>
<p>Auch wuerde ich das nicht gelten lassen:</p>
<pre><code>Eingabe: abcaabcab
Zykluslaenge 7
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1987149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1987149</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sun, 28 Nov 2010 18:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sun, 28 Nov 2010 18:50:55 GMT]]></title><description><![CDATA[<p>abcaabcab hat doch eine Zykluslänge von 7!?<br />
4 ist es jedenfalls nicht:</p>
<pre><code>abca
    abca
        b
</code></pre>
<p>Welche meintest du dann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1987163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1987163</guid><dc:creator><![CDATA[abcaabcab]]></dc:creator><pubDate>Sun, 28 Nov 2010 18:50:55 GMT</pubDate></item><item><title><![CDATA[Reply to zeichenkette erkennen und zyklusfolge ausgeben on Sun, 28 Nov 2010 19:13:49 GMT]]></title><description><![CDATA[<p>Naja, ich braeuchte schon mindestens eine Wiederholung, sonst ist es kein Zyklus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1987175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1987175</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sun, 28 Nov 2010 19:13:49 GMT</pubDate></item></channel></rss>