logo

다른 문자열에 정의된 순서에 따라 문자열 정렬

두 개의 문자열(소문자)에 패턴과 문자열이 주어졌습니다. 작업은 패턴에 정의된 순서에 따라 문자열을 정렬하는 것입니다. 패턴에는 문자열의 모든 문자가 있고 패턴의 모든 문자는 한 번만 나타난다고 가정할 수 있습니다.

해시맵 자바

예:  

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에 있는 모든 문자의 발생 횟수를 계산하고 이 수를 count 배열에 저장하는 것입니다. 그런 다음 왼쪽에서 오른쪽으로 패턴을 탐색하고 각 문자 pat[i]에 대해 그것이 카운트 배열에 몇 번 나타나는지 확인하고 이 문자를 str에 여러 번 복사합니다.
아래는 위의 아이디어를 구현한 것입니다. 



구현:

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> 

산출
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의 모든 문자가 있다고 가정합니다. 패턴에 모든 문자가 없을 수 있고 작업이 나머지 모든 문자(문자열에는 있지만 패턴에는 없음)를 끝에 배치하는 수정된 버전을 고려하십시오. 나머지 문자는 알파벳순으로 정렬되어야 합니다. 힌트: 두 번째 루프에서 인덱스를 늘리고 문자를 str에 넣을 때 해당 시간에 개수를 줄일 수도 있습니다. 마지막으로 count 배열을 순회하여 나머지 문자를 알파벳순으로 정렬합니다.

 

퀴즈 만들기