Étant donné deux chaînes (de lettres minuscules), un motif et une chaîne. La tâche consiste à trier les chaînes selon l'ordre défini par le modèle. On peut supposer que le modèle contient tous les caractères de la chaîne et que tous les caractères du modèle n'apparaissent qu'une seule fois.
Exemples :
Input : pat = 'bca' str = 'abc' Output : str = 'bca' Input : pat = 'bxyzca' str = 'abcabcabc' Output : str = 'bbbcccaaa' Input : pat = 'wcyuogmlrdfphitxjakqvzbnes' str = 'jcdokai' Output : str = 'codijak'
Approche 1 : L'idée est de compter d'abord les occurrences de tous les caractères dans str et de stocker ces nombres dans un tableau de comptage. Parcourez ensuite le motif de gauche à droite et pour chaque caractère pat[i], voyez combien de fois il apparaît dans le tableau count et copiez ce caractère plusieurs fois dans str.
Vous trouverez ci-dessous la mise en œuvre de l’idée ci-dessus.
Mise en œuvre:
C++// C++ program to sort a string according to the // order defined by a pattern string #include using namespace std; const int MAX_CHAR = 26; // Sort str according to the order defined by pattern. void sortByPattern(string& str string pat) { // Create a count array store count of characters in str. int count[MAX_CHAR] = { 0 }; // Count number of occurrences of each character // in str. for (int i = 0; i < str.length(); i++) count[str[i] - 'a']++; // Traverse the pattern and print every characters // same number of times as it appears in str. This // loop takes O(m + n) time where m is length of // pattern and n is length of str. int index = 0; for (int i = 0; i < pat.length(); i++) for (int j = 0; j < count[pat[i] - 'a']; j++) str[index++] = pat[i]; } // Driver code int main() { string pat = 'bca'; string str = 'abc'; sortByPattern(str pat); cout << str; return 0; }
Java // Java program to sort a string according to the // order defined by a pattern string class GFG { static int MAX_CHAR = 26; // Sort str according to the order defined by pattern. static void sortByPattern(char[] str char[] pat) { // Create a count array store // count of characters in str. int count[] = new int[MAX_CHAR]; // Count number of occurrences of // each character in str. for (int i = 0; i < str.length; i++) { count[str[i] - 'a']++; } // Traverse the pattern and print every characters // same number of times as it appears in str. This // loop takes O(m + n) time where m is length of // pattern and n is length of str. int index = 0; for (int i = 0; i < pat.length; i++) { for (int j = 0; j < count[pat[i] - 'a']; j++) { str[index++] = pat[i]; } } } // Driver code public static void main(String args[]) { char[] pat = 'bca'.toCharArray(); char[] str = 'abc'.toCharArray(); sortByPattern(str pat); System.out.println(String.valueOf(str)); } } // This code has been contributed by 29AjayKumar
Python3 # Python3 program to sort a string according to # the order defined by a pattern string MAX_CHAR = 26 # Sort str according to the order defined by pattern. def sortByPattern(str pat): global MAX_CHAR # Create a count array store count # of characters in str. count = [0] * MAX_CHAR # Count number of occurrences of # each character in str. for i in range (0 len(str)): count[ord(str[i]) - 97] += 1 # Traverse the pattern and print every characters # same number of times as it appears in str. This # loop takes O(m + n) time where m is length of # pattern and n is length of str. index = 0; str = '' for i in range (0 len(pat)): j = 0 while(j < count[ord(pat[i]) - ord('a')]): str += pat[i] j = j + 1 index += 1 return str # Driver code pat = 'bca' str = 'abc' print(sortByPattern(str pat)) # This code is contributed by ihritik
C# // C# program to sort a string according to the // order defined by a pattern string using System; class GFG { static int MAX_CHAR = 26; // Sort str according to the order defined by pattern. static void sortByPattern(char[] str char[] pat) { // Create a count array store // count of characters in str. int[] count = new int[MAX_CHAR]; // Count number of occurrences of // each character in str. for (int i = 0; i < str.Length; i++) { count[str[i] - 'a']++; } // Traverse the pattern and print every characters // same number of times as it appears in str. This // loop takes O(m + n) time where m is length of // pattern and n is length of str. int index = 0; for (int i = 0; i < pat.Length; i++) { for (int j = 0; j < count[pat[i] - 'a']; j++) { str[index++] = pat[i]; } } } // Driver code public static void Main(String[] args) { char[] pat = 'bca'.ToCharArray(); char[] str = 'abc'.ToCharArray(); sortByPattern(str pat); Console.WriteLine(String.Join('' str)); } } /* This code contributed by PrinciRaj1992 */
JavaScript <script> // Javascript program to sort a string according to the // order defined by a pattern string let MAX_CHAR = 26; // Sort str according to the order defined by pattern. function sortByPattern(strpat) { // Create a count array stor // count of characters in str. let count = new Array(MAX_CHAR); for(let i = 0; i < MAX_CHAR; i++) { count[i] = 0; } // Count number of occurrences of // each character in str. for (let i = 0; i < str.length; i++) { count[str[i].charCodeAt(0) - 'a'.charCodeAt(0)]++; } // Traverse the pattern and print every characters // same number of times as it appears in str. This // loop takes O(m + n) time where m is length of // pattern and n is length of str. let index = 0; for (let i = 0; i < pat.length; i++) { for (let j = 0; j < count[pat[i].charCodeAt(0) - 'a'.charCodeAt(0)]; j++) { str[index++] = pat[i]; } } } // Driver code let pat = 'bca'.split(''); let str = 'abc'.split(''); sortByPattern(str pat); document.write((str).join('')); // This code is contributed by rag2127 </script>
Sortir
bca
Complexité temporelle : O(m+n) où m est la longueur du motif et n est la longueur de str.
Espace auxiliaire : O(1)
Approche 2 :
Nous pouvons passer un comparateur à la fonction sort() et trier la chaîne selon le modèle.
C++#include using namespace std; // Declaring a vector globally that stores which character // is occurring first vector<int> position(26 -1); //Comparator function bool cmp(char& char1 char& char2) { return position[char1 - 'a'] < position[char2 - 'a']; } int main() { // Pattern string pat = 'wcyuogmlrdfphitxjakqvzbnes'; for (int i = 0; i < pat.length(); i++) { if (position[pat[i] - 'a'] == -1) position[pat[i] - 'a'] = i; } // String to be sorted string str = 'jcdokai'; // Passing a comparator to sort function sort(str.begin() str.end() cmp); cout << str; }
Java import java.util.*; class Main { // Declaring a list globally that stores which character is occurring first static List<Integer> position = new ArrayList<>(Collections.nCopies(26 -1)); // Comparator function static int cmp(char char1 char char2) { if (position.get(char1 - 'a') < position.get(char2 - 'a')) { return -1; } else if (position.get(char1 - 'a') > position.get(char2 - 'a')) { return 1; } else { return 0; } } public static void main(String[] args) { // Pattern String pat = 'wcyuogmlrdfphitxjakqvzbnes'; for (int i = 0; i < pat.length(); i++) { if (position.get(pat.charAt(i) - 'a') == -1) { position.set(pat.charAt(i) - 'a' i); } } // String to be sorted String str = 'jcdokai'; // Passing a comparator to the sorted function char[] charArr = str.toCharArray(); Arrays.sort(charArr new Comparator<Character>() { public int compare(Character c1 Character c2) { return cmp(c1 c2); } }); String sortedStr = new String(charArr); System.out.println(sortedStr); } }
Python3 from typing import List from functools import cmp_to_key # Declaring a list globally that stores which character is occurring first position: List[int] = [-1] * 26 # Comparator function def cmp(char1: str char2: str) -> int: if position[ord(char1) - ord('a')] < position[ord(char2) - ord('a')]: return -1 elif position[ord(char1) - ord('a')] > position[ord(char2) - ord('a')]: return 1 else: return 0 if __name__ == '__main__': # Pattern pat = 'wcyuogmlrdfphitxjakqvzbnes' for i in range(len(pat)): if position[ord(pat[i]) - ord('a')] == -1: position[ord(pat[i]) - ord('a')] = i # String to be sorted str = 'jcdokai' # Passing a comparator to the sorted function sorted_str = sorted(str key=cmp_to_key(cmp)) print(''.join(sorted_str)) # This code is contributed by adityashatmfh
JavaScript <script> // Declaring a vector globally that stores which character // is occurring first let position = new Array(26).fill(-1); //Comparator function function cmp(char1 char2) { return position[char1.charCodeAt(0) - 'a'.charCodeAt(0)] - position[char2.charCodeAt(0) - 'a'.charCodeAt(0)]; } // driver code // Pattern let pat = 'wcyuogmlrdfphitxjakqvzbnes'; for (let i = 0; i <br pat.length; i++) { if (position[pat.charCodeAt(i) - 'a'.charCodeAt(0)] == -1) position[pat.charCodeAt(i) - 'a'.charCodeAt(0)] = i; } // String to be sorted let str = 'jcdokai'; // Passing a comparator to sort function str = str.split('').sort(cmp).join(''); document.write(str''); // This code is contributed by Shinjan Patra </script>
C# // C# program for the above approach using System; using System.Collections.Generic; using System.Linq; class GFG { // Declaring a list globally that stores which character is occurring first static List<int> position = Enumerable.Repeat(-1 26).ToList(); // Comparator function static int Cmp(char char1 char char2) { if (position[char1 - 'a'] < position[char2 - 'a']) { return -1; } else if (position[char1 - 'a'] > position[char2 - 'a']) { return 1; } else { return 0; } } public static void Main() { // Pattern string pat = 'wcyuogmlrdfphitxjakqvzbnes'; for (int i = 0; i < pat.Length; i++) { if (position[pat[i] - 'a'] == -1) { position[pat[i] - 'a'] = i; } } // String to be sorted string str = 'jcdokai'; // Passing a comparator to the sorted function char[] charArr = str.ToCharArray(); Array.Sort(charArr new Comparison<char>(Cmp)); string sortedStr = new string(charArr); Console.WriteLine(sortedStr); } } // This code is contributed by sdeadityasharma
Sortir
codijak
Complexité temporelle : O(m+nlogn ) où m est la longueur du motif et n est la longueur de str.
Espace auxiliaire : O(1)
Exercice : Dans la solution ci-dessus, il est supposé que le modèle contient tous les caractères str. Considérons une version modifiée dans laquelle le modèle peut ne pas contenir tous les caractères et la tâche consiste à mettre tous les caractères restants (dans la chaîne mais pas dans le modèle) à la fin. Les caractères restants doivent être classés par ordre alphabétique. Astuce : dans la deuxième boucle, lorsque vous augmentez l'index et placez le caractère dans str, nous pouvons également diminuer le nombre à ce moment-là. Et enfin, nous parcourons le tableau count pour placer les caractères restants par ordre alphabétique.
Créer un quiz