logo

Vérifier si la chaîne suit ou non l'ordre des caractères défini par un modèle | Ensemble 3

Étant donné une chaîne d'entrée et un modèle, vérifiez si les caractères de la chaîne d'entrée suivent le même ordre que celui déterminé par les caractères présents dans le modèle. Supposons qu’il n’y ait pas de caractères en double dans le modèle.

Exemples :  



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.

Nous avons discuté de deux approches pour résoudre ce problème. 
Vérifier si la chaîne suit ou non l'ordre des caractères défini par un modèle | Ensemble 1  
Vérifier si la chaîne suit ou non l'ordre des caractères défini par un modèle | Ensemble 2

Dans cette approche, nous attribuons d’abord une étiquette (ou un ordre) aux caractères du motif. Les étiquettes sont attribuées par ordre croissant. 

Par exemple, le modèle « gsr » est étiqueté comme suit : 



'g' => 1 's' => 2 'r' => 3

Cela signifie que « g » viendra en premier, puis « s » puis « r »
Après avoir attribué des étiquettes aux caractères de modèle, nous parcourons les caractères de chaîne. Pendant le parcours, nous gardons une trace de l'étiquette (ou de l'ordre) du dernier caractère visité. Si l'étiquette du caractère actuel est inférieure au caractère précédent, nous renvoyons false. Sinon, nous mettons à jour la dernière étiquette. Si tous les caractères suivent l'ordre, nous retournons vrai.

Ci-dessous la mise en œuvre 

C++
// C++ program to find if a string follows order // defined by a given pattern. #include    using namespace std; const int CHAR_SIZE = 256; // Returns true if characters of str follow // order defined by a given ptr. bool checkPattern(string str string pat) {  // Initialize all orders as -1  vector<int> label(CHAR_SIZE -1);  // Assign an order to pattern characters  // according to their appearance in pattern  int order = 1;  for (int i = 0; i < pat.length() ; i++)  {  // give the pattern characters order  label[pat[i]] = order;  // increment the order  order++;  }  // Now one by check if string characters  // follow above order  int last_order = -1;  for (int i = 0; i < str.length(); i++)  {  if (label[str[i]] != -1)  {  // If order of this character is less  // than order of previous return false.  if (label[str[i]] < last_order)  return false;  // Update last_order for next iteration  last_order = label[str[i]];  }  }  // return that str followed pat  return true; } // Driver code int main() {  string str = 'engineers rock';  string pattern = 'gsr';  cout << boolalpha << checkPattern(str pattern);  return 0; } 
Java
// Java program to find if a string follows order  // defined by a given pattern. class GFG  {  static int CHAR_SIZE = 256;  // Returns true if characters of str follow  // order defined by a given ptr.  static boolean checkPattern(String str  String pat)  {  int[] label = new int[CHAR_SIZE];  // Initialize all orders as -1  for (int i = 0; i < CHAR_SIZE; i++)  label[i] = -1;  // Assign an order to pattern characters  // according to their appearance in pattern  int order = 1;  for (int i = 0; i < pat.length(); i++)   {  // give the pattern characters order  label[pat.charAt(i)] = order;  // increment the order  order++;  }  // Now one by check if string characters  // follow above order  int last_order = -1;  for (int i = 0; i < str.length(); i++)  {  if (label[str.charAt(i)] != -1)  {  // If order of this character is less  // than order of previous return false.  if (label[str.charAt(i)] < last_order)  return false;  // Update last_order for next iteration  last_order = label[str.charAt(i)];  }  }  // return that str followed pat  return true;  }  // Driver code  public static void main(String[] args)  {  String str = 'engineers rock';  String pattern = 'gsr';  System.out.println(checkPattern(str pattern));  } } // This code is contributed by // sanjeev2552 
Python3
# Python3 program to find if a string follows # order defined by a given pattern CHAR_SIZE = 256 # Returns true if characters of str follow  # order defined by a given ptr.  def checkPattern(Str pat): # Initialize all orders as -1 label = [-1] * CHAR_SIZE # Assign an order to pattern characters # according to their appearance in pattern order = 1 for i in range(len(pat)): # Give the pattern characters order label[ord(pat[i])] = order # Increment the order order += 1 # Now one by one check if string # characters follow above order last_order = -1 for i in range(len(Str)): if (label[ord(Str[i])] != -1): # If order of this character is less # than order of previous return false if (label[ord(Str[i])] < last_order): return False # Update last_order for next iteration last_order = label[ord(Str[i])] # return that str followed pat return True # Driver Code if __name__ == '__main__': Str = 'engineers rock' pattern = 'gsr' print(checkPattern(Str pattern)) # This code is contributed by himanshu77 
C#
// C# program to find if a string follows order  // defined by a given pattern. using System; class GFG  {  static int CHAR_SIZE = 256;  // Returns true if characters of str follow  // order defined by a given ptr.  static bool checkPattern(String str  String pat)  {  int[] label = new int[CHAR_SIZE];  // Initialize all orders as -1  for (int i = 0; i < CHAR_SIZE; i++)  label[i] = -1;  // Assign an order to pattern characters  // according to their appearance in pattern  int order = 1;  for (int i = 0; i < pat.Length; i++)   {  // give the pattern characters order  label[pat[i]] = order;  // increment the order  order++;  }  // Now one by check if string characters  // follow above order  int last_order = -1;  for (int i = 0; i < str.Length; i++)  {  if (label[str[i]] != -1)  {  // If order of this character is less  // than order of previous return false.  if (label[str[i]] < last_order)  return false;  // Update last_order for next iteration  last_order = label[str[i]];  }  }  // return that str followed pat  return true;  }  // Driver code  public static void Main(String[] args)  {  String str = 'engineers rock';  String pattern = 'gsr';  Console.WriteLine(checkPattern(str pattern));  } } // This code is contributed by 29AjayKumar 
JavaScript
<script> // Javascript program to find if a string follows order  // defined by a given pattern. let CHAR_SIZE = 256;  // Returns true if characters of str follow  // order defined by a given ptr. function checkPattern(strpat) {  let label = new Array(CHAR_SIZE);    // Initialize all orders as -1  for (let i = 0; i < CHAR_SIZE; i++)  label[i] = -1;    // Assign an order to pattern characters  // according to their appearance in pattern  let order = 1;  for (let i = 0; i < pat.length; i++)   {    // give the pattern characters order  label[pat[i].charCodeAt(0)] = order;    // increment the order  order++;  }    // Now one by check if string characters  // follow above order  let last_order = -1;  for (let i = 0; i < str.length; i++)  {  if (label[str[i].charCodeAt(0)] != -1)  {    // If order of this character is less  // than order of previous return false.  if (label[str[i].charCodeAt(0)] < last_order)  return false;    // Update last_order for next iteration  last_order = label[str[i].charCodeAt(0)];  }  }    // return that str followed pat  return true; } // Driver code let str = 'engineers rock'; let pattern = 'gsr'; document.write(checkPattern(str pattern));  // This code is contributed by rag2127 </script> 

Sortir
false

Complexité temporelle de ce programme est Sur) avec un espace supplémentaire constant (l'étiquette du tableau est de taille constante 256).



Espace auxiliaire : O(256).