בהינתן שתי מחרוזות (מאותיות קטנות) תבנית ומיתר. המשימה היא למיין מחרוזות לפי הסדר המוגדר על ידי התבנית. ניתן להניח שבתבנית יש את כל התווים של המחרוזת וכל התווים בתבנית מופיעים פעם אחת בלבד.
עיבוד פריצה
דוגמאות:
Input : pat = 'bca' str = 'abc' Output : str = 'bca' Input : pat = 'bxyzca' str = 'abcabcabc' Output : str = 'bbbcccaaa' Input : pat = 'wcyuogmlrdfphitxjakqvzbnes' str = 'jcdokai' Output : str = 'codijak'
גישה 1: הרעיון הוא לספור תחילה מופעים של כל התווים ב-str ולאחסן את הספירות הללו במערך ספירה. לאחר מכן חצו את התבנית משמאל לימין ועבור כל תו pat[i] ראו כמה פעמים הוא מופיע במערך ספירה והעתיקו את התו הזה פעמים רבות ל-str.
להלן יישום הרעיון לעיל.
יישום:
כפתור tkinterC++
// 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>
תְפוּקָה
bca
מורכבות הזמן: O(m+n) כאשר m הוא אורך התבנית ו-n הוא אורך str.
מרחב עזר: O(1)
גישה 2:
נוכל להעביר משווה לפונקציה sort() ולמיין את המחרוזת לפי התבנית.
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
תְפוּקָה
codijak
מורכבות הזמן: O(m+nlogn ) כאשר m הוא אורך התבנית ו-n הוא אורך str.
מרחב עזר: O(1)
המחרוזת ריקה
תַרגִיל : בפתרון הנ"ל מניחים שלתבנית יש את כל התווים של str. שקול גרסה שונה שבה ייתכן שהתבנית לא כוללת את כל התווים והמשימה היא לשים את כל התווים הנותרים (במחרוזת אך לא בתבנית) בסוף. יש לשים את שאר התווים בסדר אלפביתי. ולבסוף אנו חוצים את מערך הספירה כדי להכניס את שאר התווים בסדר אלפביתי.
צור חידון