📌  相关文章
📜  检查字符串是否遵循模式定义的字符顺序 |设置 3

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

检查字符串是否遵循模式定义的字符顺序 |设置 3

给定一个输入字符串和一个模式,检查输入字符中的字符串是否遵循与模式中存在的字符相同的顺序。假设模式中不会有任何重复的字符。
例子:

Input: string = "engineers rock", pattern = "er";
Output: true
All 'e' in the input string are before all 'r'.

Input: string = "engineers rock", pattern = "egr";
Output: false
There are two 'e' after 'g' in the input string.

Input: string = "engineers rock", pattern = "gsr";
Output: false
There are one 'r' before 's' in the input string.

我们已经讨论了解决这个问题的两种方法。
检查字符串是否遵循模式定义的字符顺序 |设置 1
检查字符串是否遵循模式定义的字符顺序 |设置 2

在这种方法中,我们首先为模式字符分配标签(或顺序)。标签按升序分配。
例如,模式“gsr”标记如下

"g" => 1
"s" => 2
"r" => 3

这意味着'g'将首先出现,然后是's',然后是'r'
在为模式字符分配标签之后,我们遍历字符串字符。在遍历时,我们跟踪最后访问字符的标签(或顺序)。如果当前字符的标签小于前一个字符,我们返回 false。否则我们更新最后一个标签。如果所有字符都遵循顺序,我们返回 true。
下面是实现

C++
// C++ program to find if a string follows order
// defined by a given pattern.
#include 
using namespace std;
 
const int CHAR_SIZE = 256;
 
// Returns true if characters of str follow
// order defined by a given ptr.
bool checkPattern(string str, string pat)
{
    // Initialize all orders as -1
    vector label(CHAR_SIZE, -1);
 
    // Assign an order to pattern characters
    // according to their appearance in pattern
    int order = 1;
    for (int i = 0; i < pat.length() ; i++)
    {
        // give the pattern characters order
        label[pat[i]] = order;
 
        // increment the order
        order++;
    }
 
    //  Now one by check if string characters
    // follow above order
    int last_order = -1;
    for (int i = 0; i < str.length(); i++)
    {
        if (label[str[i]] != -1)
        {
            // If order of this character is less
            // than order of previous, return false.
            if (label[str[i]] < last_order)
                return false;
 
            // Update last_order for next iteration
            last_order =  label[str[i]];
        }
    }
 
    // return that str followed pat
    return true;
}
 
// Driver code
int main()
{
    string str = "engineers rock";
    string pattern = "gsr";
 
    cout << boolalpha << checkPattern(str, pattern);
 
    return 0;
}


Java
// Java program to find if a string follows order
// defined by a given pattern.
class GFG
{
    static int CHAR_SIZE = 256;
 
    // Returns true if characters of str follow
    // order defined by a given ptr.
    static boolean checkPattern(String str,
                                String pat)
    {
        int[] label = new int[CHAR_SIZE];
 
        // Initialize all orders as -1
        for (int i = 0; i < CHAR_SIZE; i++)
            label[i] = -1;
 
        // Assign an order to pattern characters
        // according to their appearance in pattern
        int order = 1;
        for (int i = 0; i < pat.length(); i++)
        {
 
            // give the pattern characters order
            label[pat.charAt(i)] = order;
 
            // increment the order
            order++;
        }
 
        // Now one by check if string characters
        // follow above order
        int last_order = -1;
        for (int i = 0; i < str.length(); i++)
        {
            if (label[str.charAt(i)] != -1)
            {
 
                // If order of this character is less
                // than order of previous, return false.
                if (label[str.charAt(i)] < last_order)
                    return false;
 
                // Update last_order for next iteration
                last_order = label[str.charAt(i)];
            }
        }
 
        // return that str followed pat
        return true;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "engineers rock";
        String pattern = "gsr";
        System.out.println(checkPattern(str, pattern));
    }
}
 
// This code is contributed by
// sanjeev2552


Python3
# Python3 program to find if a string follows
# order defined by a given pattern
CHAR_SIZE = 256
 
# Returns true if characters of str follow
# order defined by a given ptr.
def checkPattern(Str, pat):
 
    # Initialize all orders as -1
    label = [-1] * CHAR_SIZE
 
    # Assign an order to pattern characters
    # according to their appearance in pattern
    order = 1
     
    for i in range(len(pat)):
 
        # Give the pattern characters order
        label[ord(pat[i])] = order
 
        # Increment the order
        order += 1
 
    # Now one by one check if string
    # characters follow above order
    last_order = -1
     
    for i in range(len(Str)):
        if (label[ord(Str[i])] != -1):
 
            # If order of this character is less
            # than order of previous, return false
            if (label[ord(Str[i])] < last_order):
                return False
 
            # Update last_order for next iteration
            last_order = label[ord(Str[i])]
 
    # return that str followed pat
    return True
 
# Driver Code
if __name__ == '__main__':
     
    Str = "engineers rock"
    pattern = "gsr"
 
    print(checkPattern(Str, pattern))
 
# This code is contributed by himanshu77


C#
// C# program to find if a string follows order
// defined by a given pattern.
using System;
 
class GFG
{
    static int CHAR_SIZE = 256;
 
    // Returns true if characters of str follow
    // order defined by a given ptr.
    static bool checkPattern(String str,
                                String pat)
    {
        int[] label = new int[CHAR_SIZE];
 
        // Initialize all orders as -1
        for (int i = 0; i < CHAR_SIZE; i++)
            label[i] = -1;
 
        // Assign an order to pattern characters
        // according to their appearance in pattern
        int order = 1;
        for (int i = 0; i < pat.Length; i++)
        {
 
            // give the pattern characters order
            label[pat[i]] = order;
 
            // increment the order
            order++;
        }
 
        // Now one by check if string characters
        // follow above order
        int last_order = -1;
        for (int i = 0; i < str.Length; i++)
        {
            if (label[str[i]] != -1)
            {
 
                // If order of this character is less
                // than order of previous, return false.
                if (label[str[i]] < last_order)
                    return false;
 
                // Update last_order for next iteration
                last_order = label[str[i]];
            }
        }
 
        // return that str followed pat
        return true;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        String str = "engineers rock";
        String pattern = "gsr";
        Console.WriteLine(checkPattern(str, pattern));
    }
}
 
// This code is contributed by 29AjayKumar


Javascript


输出:

false