logo

Сортувати рядок відповідно до порядку, визначеного іншим рядком

Дано два рядки (малих літер) шаблон і рядок. Завдання полягає в тому, щоб відсортувати рядки відповідно до порядку, визначеного шаблоном. Можна припустити, що шаблон містить усі символи рядка і всі символи в шаблоні з’являються лише один раз.

цикл while java

приклади:  

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], скільки разів він з’являється в масиві count, і скопіюйте цей символ стільки разів у str.
Нижче представлена ​​реалізація вищеописаної ідеї. 



Реалізація:

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> 

Вихід
bca

Часова складність: O(m+n) де m — довжина візерунка, а n — довжина нитки.
Допоміжний простір:  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 — довжина нитки.
 Допоміжний простір:  O(1)

Вправа : у наведеному вище рішенні передбачається, що шаблон містить усі символи str. Розглянемо модифіковану версію, де шаблон може містити не всі символи, а завдання полягає в тому, щоб поставити всі символи, що залишилися (у рядку, але не в шаблоні) у кінці. Решту символів потрібно розмістити в алфавітному порядку. Підказка: у другому циклі, коли збільшується індекс і поміщається символ у str, ми також можемо зменшити кількість. І, нарешті, ми проходимо масив підрахунку, щоб розташувати решту символів в алфавітному порядку.

 

Створіть вікторину