📌  相关文章
📜  根据另一个字符串定义的顺序对字符串进行排序

📅  最后修改于: 2022-05-13 01:57:07.244000             🧑  作者: Mango

根据另一个字符串定义的顺序对字符串进行排序

给定两个字符串(小写字母)、一个模式和一个字符串。任务是根据模式定义的顺序对字符串进行排序。可以假设模式具有字符串的所有字符并且模式中的所有字符只出现一次。
例子:

Input  : pat = "bca", str = "abc"
Output : str = "bca"

Input  : pat = "bxyzca", str = "abcabcabc"
Output : str = "bbbcccaaa"

Input  : pat = "wcyuogmlrdfphitxjakqvzbnes", str = "jcdokai"
Output : str = "codijak"

方法一:
这个想法是首先计算 str 中所有字符的出现次数,并将这些计数存储在一个计数数组中。然后从左到右遍历pattern,对于每个字符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 stor
        // 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 stor
        // 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


C++
#include 
using namespace std;
 
// Declaring a vector globally that stores which character
// is occuring first
vector 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;
}


输出
bca

时间复杂度: O(m + n),其中 m 是模式的长度,n 是 str 的长度。

方法 2:使用 STL

我们可以将比较器传递给 C++ 中的 sort()函数,并根据模式对字符串进行排序。

C++

#include 
using namespace std;
 
// Declaring a vector globally that stores which character
// is occuring first
vector 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;
}
输出
codijak

练习:在上述解决方案中,假设模式具有 str 的所有字符。考虑一个修改版本,其中模式可能没有所有字符,任务是将所有剩余的字符(在字符串中但不在模式中)放在最后。剩下的字符需要按字母顺序排列。提示:在第二个循环中,当增加索引并将字符放入str时,我们也可以减少此时的计数。最后,我们遍历 count 数组以将剩余的字符按字母顺序排列。