logo

Sortera en sträng enligt den ordning som definieras av en annan sträng

Givet två strängar (av små bokstäver) ett mönster och en sträng. Uppgiften är att sortera strängar enligt den ordning som definieras av mönstret. Det kan antas att mönstret har alla tecken i strängen och att alla tecken i mönstret endast visas en gång.

som gjorde skolan

Exempel:  

Input : pat = 'bca' str = 'abc' Output : str = 'bca' Input : pat = 'bxyzca' str = 'abcabcabc' Output : str = 'bbbcccaaa' Input : pat = 'wcyuogmlrdfphitxjakqvzbnes' str = 'jcdokai' Output : str = 'codijak'

Tillvägagångssätt 1: Tanken är att först räkna förekomster av alla tecken i str och lagra dessa räkningar i en räknematris. Gå sedan igenom mönstret från vänster till höger och för varje tecken pat[i] se hur många gånger det visas i count array och kopiera detta tecken dessa många gånger till str.
Nedan är implementeringen av ovanstående idé. 



Genomförande:

all caps kommandot excel
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> 

Produktion
bca

Tidskomplexitet: O(m+n) där m är längden på mönstret och n är längden på str.
Hjälputrymme:  O(1)  

Tillvägagångssätt 2: 

Vi kan skicka en komparator till sort()-funktionen och sortera strängen enligt mönstret.

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 

Produktion
codijak


Tidskomplexitet: O(m+nlogn ) där m är längden på mönstret och n är längden på str.
 Hjälputrymme:  O(1)

hur man returnerar array i java

Utöva : I ovanstående lösning antas det att mönstret har alla tecken av str. Överväg en modifierad version där mönstret kanske inte har alla tecken och uppgiften är att sätta alla återstående tecken (i strängen men inte i mönstret) i slutet. De återstående tecknen måste placeras i alfabetiskt sorterad ordning.Tips: I den andra slingan när vi ökar indexet och sätter tecknet i str kan vi också minska antalet vid den tiden. Och slutligen korsar vi räkningsfältet för att placera de återstående tecknen i alfabetiskt sorterad ordning.

 

Skapa frågesport