2016-07-22 7 views
0

Ich versuche einen rekursiven Algorithmus zu erstellen, der ausgehend von einer Zeichenfolge wie "xxxzzppp" nur wahr zurückgibt, wenn jede Sequenz (kontinuierliche Teilzeichenfolge) derselben Charakter besteht aus weniger oder gleichwertigen Zeichen im Vergleich zu dem folgenden, bis zum Ende.Rekursiver Algorithmus für Teilstrings desselben Zeichens in C

Es wird angenommen, dass eine Zeichenfolge alphabetisch geordnet ist.

Es wird ansonsten 0 zurückgegeben.

Beispiel:

xxppp = 1; // by = I mean that it should return that value when given to the function 
xxxp = 0; 
nnnpppz = 0; 
npz = 1; 
npp = 1; 
llleeeegggg = 1; 

ich das versucht:

int CheckOcc(char seq[]) { 
    int j = 0, counter = 0; 

    if (strlen(seq) == 0) 
     return 100; //last is always shorter than nothing 

    for (j = 0; j < strlen(seq); j++) 
     if (seq[0] == seq[j]) 
      counter++; 

    if (counter <= CheckOcc(seq + j)) 
     return counter; 
    else 
     return 0; 

} 

Aber ich kann einfach nicht bekommen es funktioniert, kann jemand einen Vorschlag geben, bitte? Ich bin seit zwei Stunden drüber und kann es einfach nicht herausfinden.

EDIT:

Bitte beachten Sie, dass durch f + j vorbei, ich bin vorbei tatsächlich die stirng aus dem ersten Teilkette beginnend nach dem einen, der gerade zu Ende ist. Die Zeigeralgebra ist korrekt, ich kann den Algorithmus einfach nicht herausfinden, insbesondere weiß ich nicht, wie zu zurückzukehren. Jede Hilfe wird sehr geschätzt.

+0

Leider @chux, ich Zählung statt Zähler geschrieben, während ich den nutzlosen Teil gelöscht wurde. Es wurde jetzt behoben. Der Code liefert Strings direkt von main in CheckOcc(), sie sind gültig, der Algorithmus funktioniert einfach nicht. – Athamas

+4

Hmm willst du 'CheckOcc (seq + counter)' '? – chux

+0

Ich möchte CheckOcc geben 1 (oder einen positiven Wert), gegeben eine Zeichenfolge, wenn die Zeichenfolge besteht aus Teilzeichenfolgen des gleichen Zeichens, die nie länger als die unmittelbar danach sind. Sonst 0. Bitte sehen Sie sich die Beispiele an, die schwer zu erklären sind. Bitte beachten Sie auch, dass die Strings korrekt sind. seq + counter vergleicht die Anzahl von der ersten mit der Zählung von der zweiten und so weiter. j zeigt auf, wo die Sequenz aufhört und eine neue durch Zeigeralgebra beginnt. Es ist das Beste, was ich mir ausgedacht habe. – Athamas

Antwort

2

versuchen diese

#include <stdio.h> 
#include <limits.h> 

int CheckOcc(char seq[]) { 
    int j = 0, counter = 0; 

    if (!*seq) return INT_MAX; 

    for (j = 0; seq[j] && *seq == seq[j]; j++) 
     counter++; 

    return (counter <= CheckOcc(seq + j)) ? counter : 0; 
} 
int main(void){ 
    char input[128]; 
    while(1 == scanf("%127[^\n]%*c", input)){ 
     if(CheckOcc(input)) 
      printf("%s = 1\n", input); 
     else 
      printf("%s = 0\n", input); 
    } 
    return 0; 
} 
+0

[DEMO] (http://ideone.com/TmeEHO) – BLUEPIXY

+0

Hallo, dein Beispiel funktioniert tatsächlich, danke, du bist wirklich sehr schlau. Wenn ich es jedoch ansehe, sehe ich meinen eigenen Denkprozess, ich kann den Unterschied nicht sehen. Ich habe auch meine eigene Hauptfunktion für deine Demo verwendet, also ist das nicht das Problem. Was habe ich falsch gemacht? EDIT- Ein weiterer Kommentar hat mir geholfen, es herauszufinden. Ich habe j zu viel inkrementiert, ich hätte eine andere Bedingung in die for-Schleife legen müssen, vielen Dank, Sir. – Athamas