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

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

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

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

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

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

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

这个想法很简单。对于模式字符串中的每一对 (x, y) 连续字符,我们在输入字符串中找到 x 的最后一次出现和 y 的第一次出现。如果字符x 的最后一次出现是在任何对的字符y 的第一次出现之后,我们返回 false。检查模式字符串中的每一对连续字符就足够了。例如,如果我们考虑模式中的三个连续字符x、y 和 z,如果 (x, y) 和 (y, z) 返回 true,则意味着 (x, z) 也为 true。
下面是上述想法的实现——

C++
// C++ program check if characters in the input string
// follows the same order as determined by characters
// present in the given pattern
#include 
using namespace std;
  
// Function to check if characters in the input string
// follows the same order as determined by characters
// present in the given pattern
bool checkPattern(string str, string pattern)
{
    // len stores length of the given pattern
    int len = pattern.length();
      
    // if length of pattern is more than length of
    // input string, return false;
    if (str.length() < len)
        return false;
      
    for (int i = 0; i < len - 1; i++)
    {
        // x, y are two adjacent characters in pattern
        char x = pattern[i];
        char y = pattern[i + 1];
         
        // find index of last occurrence of character x
        // in the input string
        size_t last = str.find_last_of(x);
          
        // find index of first occurrence of character y
        // in the input string
        size_t first = str.find_first_of(y);
          
        // return false if x or y are not present in the
        // input string OR last occurrence of x is after
        // the first occurrence of y in the input string
        if (last == string::npos || first == 
            string::npos || last > first)   
        return false;
    }
      
    // return true if string matches the pattern
    return true;
}
 
// Driver code
int main()
{
    string str = "engineers rock";
    string pattern = "gsr";
  
    cout << boolalpha << checkPattern(str, pattern);
  
    return 0;
}


Java
// Java program check if characters in the input string
// follows the same order as determined by characters
// present in the given pattern
 
class GFG
{
 
    // Function to check if characters in the input string
    // follows the same order as determined by characters
    // present in the given pattern
    static boolean checkPattern(String str, String pattern)
    {
        // len stores length of the given pattern
        int len = pattern.length();
 
        // if length of pattern is more than length of
        // input string, return false;
        if (str.length() < len)
        {
            return false;
        }
 
        for (int i = 0; i < len - 1; i++)
        {
            // x, y are two adjacent characters in pattern
            char x = pattern.charAt(i);
            char y = pattern.charAt(i + 1);
 
            // find index of last occurrence of character x
            // in the input string
            int last = str.lastIndexOf(x);
 
            // find index of first occurrence of character y
            // in the input string
            int first = str.indexOf(y);
 
            // return false if x or y are not present in the
            // input string OR last occurrence of x is after
            // the first occurrence of y in the input string
            if (last == -1 || first
                    == -1 || last > first)
            {
                return false;
            }
        }
 
        // return true if string matches the pattern
        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 contributed by Rajput-Ji


Python3
# Python3 program check if characters in
# the input string follows the same order
# as determined by characters present in
# the given pattern
 
# Function to check if characters in the
# input string follows the same order as
# determined by characters present
# in the given pattern
def checkPattern(string, pattern):
 
    # len stores length of the given pattern
    l = len(pattern)
 
    # if length of pattern is more than length
    # of input string, return false;
    if len(string) < l:
        return False
 
    for i in range(l - 1):
 
        # x, y are two adjacent characters in pattern
        x = pattern[i]
        y = pattern[i + 1]
 
        # find index of last occurrence of
        # character x in the input string
        last = string.rindex(x)
 
        # find index of first occurrence of
        # character y in the input string
        first = string.index(y)
 
        # return false if x or y are not present
        # in the input string OR last occurrence of
        # x is after the first occurrence of y
        # in the input string
        if last == -1 or first == -1 or last > first:
            return False
 
    # return true if
    # string matches the pattern
    return True
 
# Driver Code
if __name__ == "__main__":
    string = "engineers rock"
    pattern = "gsr"
    print(checkPattern(string, pattern))
 
# This code is contributed by
# sanjeev2552


C#
// C# program check if characters in the input string
// follows the same order as determined by characters
// present in the given pattern
using System;
     
class GFG
{
 
    // Function to check if characters in the input string
    // follows the same order as determined by characters
    // present in the given pattern
    static Boolean checkPattern(String str, String pattern)
    {
        // len stores length of the given pattern
        int len = pattern.Length;
 
        // if length of pattern is more than length of
        // input string, return false;
        if (str.Length < len)
        {
            return false;
        }
 
        for (int i = 0; i < len - 1; i++)
        {
            // x, y are two adjacent characters in pattern
            char x = pattern[i];
            char y = pattern[i+1];
 
            // find index of last occurrence of character x
            // in the input string
            int last = str.LastIndexOf(x);
 
            // find index of first occurrence of character y
            // in the input string
            int first = str.IndexOf(y);
 
            // return false if x or y are not present in the
            // input string OR last occurrence of x is after
            // the first occurrence of y in the input string
            if (last == -1 || first
                    == -1 || last > first)
            {
                return false;
            }
        }
 
        // return true if string matches the pattern
        return true;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        String str = "engineers rock";
        String pattern = "gsr";
 
        Console.WriteLine(checkPattern(str, pattern));
    }
}
 
/* This code contributed by PrinciRaj1992 */


Javascript


输出:

false