Dané dva reťazce (malých písmen) vzor a reťazec. Úlohou je triediť reťazce podľa poradia definovaného vzorom. Dá sa predpokladať, že vzor má všetky znaky reťazca a všetky znaky vo vzore sa vyskytujú iba raz.
Príklady:
Input : pat = 'bca' str = 'abc' Output : str = 'bca' Input : pat = 'bxyzca' str = 'abcabcabc' Output : str = 'bbbcccaaa' Input : pat = 'wcyuogmlrdfphitxjakqvzbnes' str = 'jcdokai' Output : str = 'codijak'
Prístup 1: Cieľom je najprv spočítať výskyty všetkých znakov v str a uložiť tieto počty do poľa počtu. Potom prejdite vzorom zľava doprava a pre každý znak pat[i] zistite, koľkokrát sa objaví v poli count a skopírujte tento znak mnohokrát do str.
Nižšie je uvedená implementácia vyššie uvedenej myšlienky.
Implementácia:
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>
Výstup
bca
Časová zložitosť: O(m+n) kde m je dĺžka vzoru a n je dĺžka str.
Pomocný priestor: O(1)
Prístup 2:
Funkcii sort() môžeme odovzdať komparátor a zoradiť reťazec podľa vzoru.
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
Výstup
codijak
Časová zložitosť: O(m+nlogn ) kde m je dĺžka vzoru a n je dĺžka str.
Pomocný priestor: O(1)
Cvičenie : Vo vyššie uvedenom riešení sa predpokladá, že vzor má všetky znaky str. Zvážte upravenú verziu, kde vzor nemusí mať všetky znaky a úlohou je umiestniť všetky zostávajúce znaky (v reťazci, ale nie vo vzore) na koniec. Zostávajúce znaky je potrebné zoradiť v abecednom poradí. Tip: V druhej slučke pri zvyšovaní indexu a vkladaní znaku do str môžeme počet v tom čase aj znížiť. A nakoniec prechádzame poľom počtu, aby sme zoradili zostávajúce znaky v abecednom poradí.
Vytvoriť kvíz