Check if string follows order of characters defined by a pattern or not | Set 1 - GeeksforGeeks

08 Jun, 2021
Given an input string and a pattern, check if characters in the input string follows the same order as determined by characters present in the pattern. Assume there won’t be any duplicate characters in the pattern.Examples:  
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.
 
The idea is very simple. For every pair (x, y) of consecutive characters in the pattern string, we find the last occurrence of x and first occurrence of y in the input string. If last occurrence of character x is after first occurrence of character y for any pair, we return false. Checking for every pair of consecutive characters in the pattern string will suffice. For example, if we consider three consecutive characters in the pattern say x, y and z, if (x, y) and (y, z) returns true, that implies (x, z) is also true. Below is the implementation of above idea –  
C++
Java
Python3
C#
Javascript
// C++ program check if characters in the input string// follows the same order as determined by characters// present in the given pattern#include <iostream>using namespace std;  // Function to check if characters in the input string// follows the same order as determined by characters// present in the given patternbool 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 codeint main(){    string str = "engineers rock";    string pattern = "gsr";      cout << boolalpha << checkPattern(str, pattern);      return 0;}
// 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 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 patterndef 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 Codeif __name__ == "__main__":    string = "engineers rock"    pattern = "gsr"    print(checkPattern(string, pattern)) # This code is contributed by# sanjeev2552
// C# program check if characters in the input string// follows the same order as determined by characters// present in the given patternusing 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 */
<script>      // JavaScript 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      function checkPattern(str, pattern) {        // len stores length of the given pattern        var len = pattern.length;         // if length of pattern is more than length of        // input string, return false;        if (str.length < len) {          return false;        }         for (var i = 0; i < len - 1; i++) {          // x, y are two adjacent characters in pattern          var x = pattern[i];          var y = pattern[i + 1];           // find index of last occurrence of character x          // in the input string          var last = str.lastIndexOf(x);           // find index of first occurrence of character y          // in the input string          var 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      var str = "engineers rock";      var pattern = "gsr";       document.write(checkPattern(str, pattern));             // This code is contributed by rdtank.    </script>
Output:  
false
We have discussed two more approaches to solve this problem. Check if string follows order of characters defined by a pattern or not | Set 2 Check if string follows order of characters defined by a pattern or not | Set 3This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
Rajput-Ji
princiraj1992
sanjeev2552
rdtank
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Array of Strings in C++ (5 Different Ways to Create)
Convert string to char array in C++
Python program to check if a string is palindrome or not
Longest Palindromic Substring | Set 1
Caesar Cipher in Cryptography
stringstream in C++ and its applications
How to Append a Character to a String in C
Convert character array to string in C++
Comparing two strings in C++
How to split a string in C/C++, Python and Java?