Glede na vhodni niz in vzorec preverite, ali znaki v vhodnem nizu sledijo istemu vrstnemu redu, kot ga določajo znaki v vzorcu. Predpostavimo, da v vzorcu ne bo nobenih podvojenih znakov.
Primeri:
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.
Razpravljali smo o dveh pristopih za rešitev tega problema.
Preverite, ali niz sledi vrstnemu redu znakov, določenem z vzorcem ali ne | Komplet 1
Preverite, ali niz sledi vrstnemu redu znakov, določenem z vzorcem ali ne | Komplet 2
razvrščanje arraylist java
Pri tem pristopu najprej dodelimo oznako (ali vrstni red) znakom vzorca. Oznake so dodeljene v naraščajočem vrstnem redu.
Na primer vzorec 'gsr' je označen kot sledi
'g' => 1 's' => 2 'r' => 3
To pomeni, da bo najprej "g", nato "s" in nato "r"
Po dodelitvi oznak vzorčnim znakom ponavljamo znake nizov. Med prečkanjem spremljamo oznako (ali vrstni red) nazadnje obiskanega znaka. Če je oznaka trenutnega znaka manjša od prejšnjega znaka, vrnemo false. V nasprotnem primeru posodobimo zadnjo oznako. Če vsi znaki sledijo vrstnemu redu, vrnemo true.
ali ima lahko abstraktni razred konstruktor
Spodaj je izvedba
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>
Izhod
false
Časovna zapletenost tega programa je O(n) s konstantnim dodatnim prostorom (oznaka polja je konstantne velikosti 256).
vrzi niz kot int java
Pomožni prostor: O(256).