2017-09-05 2 views
-2

Wie kann ich überprüfen, ob auf ein bestimmtes Zeichen ein anderes Zeichen in einer Zeichenfolge folgt?Prüfen, ob auf ein bestimmtes Zeichen ein anderes Zeichen folgt?

Ich möchte überprüfen, ob auf jedes 'A' in einer Zeichenfolge mindestens ein 'B' folgt. Das "B" muss nicht direkt folgen und es muss keine gerade Anzahl von A's und B's geben.

Zum Beispiel:

AAZZBB = true

AAAXXXXYB = true

BBYYYXXXAXX = false

YYYBABYYYXXXAXX = false

Hier ist Code, den ich gearbeitet, aber es hält Rückkehr wahr:

public bool BalancedAB(string str) 
     { 
      int endPos = str.Length - 1; 
      for (int pos = 0; pos <= endPos; pos++) 
      { 
       if (str[pos] == 'A') 
       { 
        if (pos < endPos) 
        { 
         char next = str[pos + 1]; 

         if (next == 'B') 
         { 
          pos++; 
          continue; 
         } 
        } 

        return true; 
       } 
      } 

      return false; 
     } 
+1

Was kommt in diesem Fall zurück: 'AZZBB'? –

+0

'if (str.LastIndexOf (" A ")! = -1 && str.IndexOf (" B ", str.LastIndexOf (" A "))> -1)' – Vikhram

+0

Dies ist ein ziemlich schlechter Weg, den Code zu strukturieren . Die Verwendung von "continue" erzeugt im Allgemeinen einen schlechten Code-Geruch und es gibt sehr wenige Fälle in der Geschichte, in denen "continue" verwendet werden sollte. Es überrascht mich nicht, dass es fälschlicherweise "wahr" zurückgibt. Wenn Sie an einem 'A' ankommen und das nächste Zeichen nicht' B' ist und es nicht am Ende der Zeichenkette ist, wird es als wahr zurückgegeben. –

Antwort

3

Sie können nur prüfen, ob der letzte Index eines Zeichens größer ist als der letzte Index des anderen

(myString.IndexOf('A') > -1) && (myString.LastIndexOf('A') < myString.LastIndexOf('B')) 
+1

Sehr elegante Lösung! –

+0

Randgehäuse. 'string myString =" B ";' Ich denke, das ist nicht klar in Frage –

+0

@ L.B - Guter Ort, ich habe eine zusätzliche Überprüfung für das erste Zeichen für diesen Fall hinzugefügt – Sayse

0

Dieser Code auf dem Testfälle gearbeitet hat:

bool HasABPairs(string word) 
{ 
    for (int i = 0; i < word.Length; i++) 
    { 
     if (word[i] == 'A') 
     { 
      bool hasEquivalentB = false; 

      for (int j = i + 1; j < word.Length; j++) 
      { 
       if (word[j] == 'B') 
       { 
        hasEquivalentB = true; 
        break; 
       } 
      } 

      if (!hasEquivalentB) 
       return false; 
     } 
    } 

    return true; 
} 

Ich denke, es ist wahrscheinlich eine Lösung, die nicht O (n²) ist, aber das löst das Problem.

0

Sie können Ihre Funktion wie im folgenden Beispiel ändern:

public static bool BalancedAB(string str) 
{ 
    int endPos = str.Length - 1; 
    for (int pos = 0; pos <= endPos; pos++) 
    { 
     if (str[pos] == 'A') 
     { 
      bool retValue = false; 
      while (pos < endPos) 
      { 
       if (str[pos + 1] != 'B') { pos++; } 
       else 
       { 
        retValue = true; 
        break; 
       } 
      } 
      if (!retValue) return false; 
     } 
    } 
    return true; 
} 
Verwandte Themen