logo

Seřaďte řetězec podle pořadí definovaného jiným řetězcem

Jsou dány dva řetězce (malých písmen) vzor a řetězec. Úkolem je seřadit řetězce podle pořadí definovaného vzorem. Lze předpokládat, že vzor má všechny znaky řetězce a všechny znaky ve vzoru se objevují pouze jednou.

tostring java

Pří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'

Přístup 1: Cílem je nejprve spočítat výskyty všech znaků v str a uložit tyto počty do pole počtu. Poté procházejte vzorem zleva doprava a pro každý znak pat[i] zjistěte, kolikrát se objeví v poli count a zkopírujte tento znak mnohokrát do str.
Níže je implementace výše uvedené myšlenky. 



Implementace:

nahrazení řetězce v jazyce Java
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á složitost: O(m+n) kde m je délka vzoru a n je délka str.
Pomocný prostor:  O(1)  

Přístup 2: 

Funkci sort() můžeme předat komparátor a seřadit řetězec podle 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á složitost: O(m+nlogn ) kde m je délka vzoru a n je délka str.
 Pomocný prostor:  O(1)

analyzovat řetězec na int

Cvičení : Ve výše uvedeném řešení se předpokládá, že vzor má všechny znaky str. Zvažte upravenou verzi, kde vzor nemusí mít všechny znaky a úkolem je umístit všechny zbývající znaky (v řetězci, ale ne ve vzoru) na konec. Zbývající znaky je potřeba seřadit v abecedním pořadí. Tip: Ve druhé smyčce při zvyšování indexu a vkládání znaku do str můžeme v tu chvíli také počet snížit. A nakonec projdeme pole počtu, abychom seřadili zbývající znaky v abecedním pořadí.

 

Vytvořit kvíz