Überprüfen Sie, ob die Zeichenfolge der durch ein Muster definierten Reihenfolge der Zeichen entspricht oder nicht | Satz 2

Anhand einer Eingabezeichenfolge und eines Musters wird überprüft, ob die Zeichen in der Eingabezeichenfolge derselben Reihenfolge folgen, die durch die im Muster vorhandenen Zeichen bestimmt wird. Gehen Sie davon aus, dass das Muster keine doppelten Zeichen enthält.
Eine weitere Lösung für das gleiche Problem wird veröffentlicht Hier .
Beispiele:  
 

Input: string = 'engineers rock' pattern = 'er'; Output: true All 'e' in the input string are before all 'r'. Input: string = 'engineers rock' pattern = 'egr'; Output: false There are two 'e' after 'g' in the input string. Input: string = 'engineers rock' pattern = 'gsr'; Output: false There are one 'r' before 's' in the input string. 


 


Die Idee hier ist, die gegebene Zeichenfolge auf das gegebene Muster zu reduzieren. Für im Muster angegebene Zeichen behalten wir nur die entsprechenden Zeichen im String bei. In der neuen Zeichenfolge löschen wir fortlaufend wiederholte Zeichen. Die geänderte Zeichenfolge sollte dann dem angegebenen Muster entsprechen. Zuletzt vergleichen wir die geänderte Zeichenfolge mit dem angegebenen Muster und geben entsprechend true oder false zurück.
Illustration: 
 

str = 'bfbaeadeacc' pat[] = 'bac' 1) Remove extra characters from str (characters that are not present in pat[] str = 'bbaaacc' [f e and d are removed] 3) Removed consecutive repeating occurrences of characters str = 'bac' 4) Since str is same as pat[] we return true 


Nachfolgend finden Sie die Umsetzung der oben genannten Schritte.
 

C++
   // C++ code for the above approach   #include          #include         using     namespace     std  ;   bool     followsPattern  (  string     str       string     pattern  )     {      // Insert all characters of pattern in a hash set      unordered_set   <  char  >     patternSet  ;      for     (  int     i     =     0  ;     i      <     pattern  .  length  ();     i  ++  )     {      patternSet  .  insert  (  pattern  [  i  ]);      }      // Build modified string (string with characters only from pattern are taken)      string     modifiedStr     =     str  ;      for     (  int     i     =     str  .  length  ()     -     1  ;     i     >=     0  ;     i  --  )     {      if     (  patternSet  .  find  (  str  [  i  ])     ==     patternSet  .  end  ())     {      modifiedStr  .  erase  (  i       1  );      }      }      // Remove more than one consecutive occurrences of pattern characters from modified string      for     (  int     i     =     modifiedStr  .  length  ()     -     1  ;     i     >     0  ;     i  --  )     {      if     (  modifiedStr  [  i  ]     ==     modifiedStr  [  i     -     1  ])     {      modifiedStr  .  erase  (  i       1  );      }      }      // After above modifications the length of modified string must be same as pattern length      if     (  pattern  .  length  ()     !=     modifiedStr  .  length  ())     {      return     false  ;      }      // And pattern characters must also be same as modified string characters      for     (  int     i     =     0  ;     i      <     pattern  .  length  ();     i  ++  )     {      if     (  pattern  [  i  ]     !=     modifiedStr  [  i  ])     {      return     false  ;      }      }      return     true  ;   }   int     main  ()     {      string     str     =     'engineers rock'  ;      string     pattern     =     'er'  ;      cout      < <     'Expected: true Actual: '      < <     followsPattern  (  str       pattern  )      < <     endl  ;      str     =     'engineers rock'  ;      pattern     =     'egr'  ;      cout      < <     'Expected: false Actual: '      < <     followsPattern  (  str       pattern  )      < <     endl  ;      str     =     'engineers rock'  ;      pattern     =     'gsr'  ;      cout      < <     'Expected: false Actual: '      < <     followsPattern  (  str       pattern  )      < <     endl  ;      str     =     'engineers rock'  ;      pattern     =     'eger'  ;      cout      < <     'Expected: true Actual: '      < <     followsPattern  (  str       pattern  )      < <     endl  ;      return     0  ;   }   // This code is contributed by adityashatmfh   
Java
   // Java program to check if characters of a string follow   // pattern defined by given pattern.   import     java.util.*  ;   public     class   OrderOfCharactersForPattern   {      public     static     boolean     followsPattern  (  String     str       String     pattern  )      {      // Insert all characters of pattern in a hash set      Set   <  Character  >     patternSet     =     neHashSet   <>  ();      for     (  int     i  =  0  ;     i   <  pattern  .  length  ();     i  ++  )      patternSet  .  add  (  pattern  .  charAt  (  i  ));      // Build modified string (string with characters only from      // pattern are taken)      StringBuilder     modifiedString     =     new     StringBuilder  (  str  );      for     (  int     i  =  str  .  length  ()  -  1  ;     i  >=  0  ;     i  --  )      if     (  !  patternSet  .  contains  (  modifiedString  .  charAt  (  i  )))      modifiedString  .  deleteCharAt  (  i  );      // Remove more than one consecutive occurrences of pattern      // characters from modified string.      for     (  int     i  =  modifiedString  .  length  ()  -  1  ;     i  >  0  ;     i  --  )      if     (  modifiedString  .  charAt  (  i  )     ==     modifiedString  .  charAt  (  i  -  1  ))      modifiedString  .  deleteCharAt  (  i  );      // After above modifications the length of modified string      // must be same as pattern length      if     (  pattern  .  length  ()     !=     modifiedString  .  length  ())      return     false  ;      // And pattern characters must also be same as modified string      // characters      for     (  int     i  =  0  ;     i   <  pattern  .  length  ();     i  ++  )      if     (  pattern  .  charAt  (  i  )     !=     modifiedString  .  charAt  (  i  ))      return     false  ;      return     true  ;      }      // Driver program      int     main  ()      {      String     str     =     'engineers rock'  ;      String     pattern     =     'er'  ;      System  .  out  .  println  (  'Expected: true Actual: '     +      followsPattern  (  str       pattern  ));      str     =     'engineers rock'  ;      pattern     =     'egr'  ;      System  .  out  .  println  (  'Expected: false Actual: '     +      followsPattern  (  str       pattern  ));      str     =     'engineers rock'  ;      pattern     =     'gsr'  ;      System  .  out  .  println  (  'Expected: false Actual: '     +      followsPattern  (  str       pattern  ));      str     =     'engineers rock'  ;      pattern     =     'eger'  ;      System  .  out  .  println  (  'Expected: true Actual: '     +      followsPattern  (  str       pattern  ));      return     0  ;      }   }   
Python3
   # Python3 program to check if characters of    # a string follow pattern defined by given pattern.   def   followsPattern  (  string     pattern  ):   # Insert all characters of pattern in a hash set   patternSet   =   set  ()   for   i   in   range  (  len  (  pattern  )):   patternSet  .  add  (  pattern  [  i  ])   # Build modified string (string with characters    # only from pattern are taken)   modifiedString   =   string   for   i   in   range  (  len  (  string  )   -   1     -  1     -  1  ):   if   not   modifiedString  [  i  ]   in   patternSet  :   modifiedString   =   modifiedString  [:  i  ]   +    modifiedString  [  i   +   1  :]   # Remove more than one consecutive occurrences    # of pattern characters from modified string.   for   i   in   range  (  len  (  modifiedString  )   -   1     0     -  1  ):   if   modifiedString  [  i  ]   ==   modifiedString  [  i   -   1  ]:   modifiedString   =   modifiedString  [:  i  ]   +    modifiedString  [  i   +   1  :]   # After above modifications the length of    # modified string must be same as pattern length   if   len  (  pattern  )   !=   len  (  modifiedString  ):   return   False   # And pattern characters must also be same    # as modified string characters   for   i   in   range  (  len  (  pattern  )):   if   pattern  [  i  ]   !=   modifiedString  [  i  ]:   return   False   return   True   # Driver Code   if   __name__   ==   '__main__'  :   string   =   'engineers rock'   pattern   =   'er'   print  (  'Expected: true Actual:'     followsPattern  (  string     pattern  ))   string   =   'engineers rock'   pattern   =   'egr'   print  (  'Expected: false Actual:'     followsPattern  (  string     pattern  ))   string   =   'engineers rock'   pattern   =   'gsr'   print  (  'Expected: false Actual:'     followsPattern  (  string     pattern  ))   string   =   'engineers rock'   pattern   =   'eger'   print  (  'Expected: true Actual:'     followsPattern  (  string     pattern  ))   # This code is contributed by   # sanjeev2552   
C#
   // C# program to check if characters of a string follow   // pattern defined by given pattern.   using     System  ;   using     System.Collections.Generic  ;   using     System.Text  ;   class     GFG   {      public     static     bool     followsPattern  (  String     str       String     pattern  )      {      // Insert all characters of pattern in a hash set      HashSet   <  char  >     patternSet     =     new     HashSet   <  char  >  ();      for     (  int     i     =     0  ;     i      <     pattern  .  Length  ;     i  ++  )      patternSet  .  Add  (  pattern  [  i  ]);      // Build modified string (string with characters       // only from pattern are taken)      StringBuilder     modifiedString     =     new     StringBuilder  (  str  );      for     (  int     i     =     str  .  Length     -     1  ;     i     >=     0  ;     i  --  )      if     (  !  patternSet  .  Contains  (  modifiedString  [  i  ]))      modifiedString  .  Remove  (  i       1  );      // Remove more than one consecutive occurrences of pattern      // characters from modified string.      for     (  int     i     =     modifiedString  .  Length     -     1  ;     i     >     0  ;     i  --  )      if     (  modifiedString  [  i  ]     ==     modifiedString  [  i     -     1  ])      modifiedString  .  Remove  (  i       1  );      // After above modifications the length of modified string      // must be same as pattern length      if     (  pattern  .  Length     !=     modifiedString  .  Length  )      return     false  ;      // And pattern characters must also be same       // as modified string characters      for     (  int     i     =     0  ;     i      <     pattern  .  Length  ;     i  ++  )      if     (  pattern  [  i  ]     !=     modifiedString  [  i  ])      return     false  ;      return     true  ;      }      // Driver program      public     static     void     Main  (  String  []     args  )      {      String     str     =     'engineers rock'  ;      String     pattern     =     'er'  ;      Console  .  WriteLine  (  'Expected: true Actual: '     +      followsPattern  (  str       pattern  ));      str     =     'engineers rock'  ;      pattern     =     'egr'  ;      Console  .  WriteLine  (  'Expected: false Actual: '     +      followsPattern  (  str       pattern  ));      str     =     'engineers rock'  ;      pattern     =     'gsr'  ;      Console  .  WriteLine  (  'Expected: false Actual: '     +      followsPattern  (  str       pattern  ));      str     =     'engineers rock'  ;      pattern     =     'eger'  ;      Console  .  WriteLine  (  'Expected: true Actual: '     +      followsPattern  (  str       pattern  ));      }   }   // This code is contributed by 29AjayKumar   
JavaScript
    <  script  >   // Javascript program to check if characters of a string follow   // pattern defined by given pattern.   function     followsPattern  (  str       pattern  )   {      // Insert all characters of pattern in a hash set      let     patternSet     =     new     Set  ();      for     (  let     i  =  0  ;     i   <  pattern  .  length  ;     i  ++  )      patternSet  .  add  (  pattern  [  i  ]);          // Build modified string (string with characters only from      // pattern are taken)      let     modifiedString     =     (  str  ).  split  (  ''  );      for     (  let     i  =  str  .  length  -  1  ;     i  >=  0  ;     i  --  )      if     (  !  patternSet  .  has  (  modifiedString  [  i  ]))      modifiedString  .  splice  (  i    1  );          // Remove more than one consecutive occurrences of pattern      // characters from modified string.      for     (  let     i  =  modifiedString  .  length  -  1  ;     i  >  0  ;     i  --  )      if     (  modifiedString  [  i  ]     ==     modifiedString  [  i  -  1  ])      modifiedString  .  splice  (  i    1  );          // After above modifications the length of modified string      // must be same as pattern length      if     (  pattern  .  length     !=     modifiedString  .  length  )      return     false  ;          // And pattern characters must also be same as modified string      // characters      for     (  let     i  =  0  ;     i   <  pattern  .  length  ;     i  ++  )      if     (  pattern  [  i  ]     !=     modifiedString  [  i  ])      return     false  ;          return     true  ;   }   // Driver program   let     str     =     'engineers rock'  ;   let     pattern     =     'er'  ;   document  .  write  (  'Expected: true Actual: '     +      followsPattern  (  str       pattern  )  +  '  
'
); str = 'engineers rock' ; pattern = 'egr' ; document . write ( 'Expected: false Actual: ' + followsPattern ( str pattern ) + '
'
); str = 'engineers rock' ; pattern = 'gsr' ; document . write ( 'Expected: false Actual: ' + followsPattern ( str pattern ) + '
'
); str = 'engineers rock' ; pattern = 'eger' ; document . write ( 'Expected: true Actual: ' + followsPattern ( str pattern ) + '
'
); // This code is contributed by rag2127 < /script>

Ausgabe:  
 

Expected: true Actual: true Expected: false Actual: false Expected: false Actual: false Expected: true Actual: true 


Zeitkomplexität: Die zeitliche Komplexität der oben genannten Implementierungen beträgt tatsächlich O(mn + n^2), da wir deleteCharAt() zum Entfernen von Zeichen verwenden. Wir können die obige Lösung so optimieren, dass sie in linearer Zeit funktioniert. Anstatt deleteCharAr() zu verwenden, können wir eine leere Zeichenfolge erstellen und ihr nur erforderliche Zeichen hinzufügen.
StringBuilder wird verwendet, um die Eingabezeichenfolge zu bearbeiten. Dies liegt daran, dass StringBuilder veränderbar ist, während String ein unveränderliches Objekt ist. Das Erstellen einer neuen Zeichenfolge benötigt O(n) Speicherplatz, sodass zusätzlicher Speicherplatz O(n) beträgt.
Wir haben zwei weitere Ansätze zur Lösung dieses Problems besprochen. 
Überprüfen Sie, ob die Zeichenfolge der durch ein Muster definierten Reihenfolge der Zeichen entspricht oder nicht | Satz 1  
Überprüfen Sie, ob die Zeichenfolge der durch ein Muster definierten Reihenfolge der Zeichen entspricht oder nicht | Satz 3