Skip to content
geeksforgeeks
  • Tutorials
    • Python
    • Java
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
    • Practice Coding Problems
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • DSA
  • Practice Pattern Searching
  • Tutorial on Pattern Searching
  • Naive Pattern Searching
  • Rabin Karp
  • KMP Algorithm
  • Z Algorithm
  • Trie for Pattern Seaching
  • Manacher Algorithm
  • Suffix Tree
  • Ukkonen's Suffix Tree Construction
  • Boyer Moore
  • Aho-Corasick Algorithm
  • Wildcard Pattern Matching
Open In App
Next Article:
Finite Automata algorithm for Pattern Searching
Next article icon

Z algorithm (Linear time pattern searching Algorithm)

Last Updated : 25 Feb, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report
Try it on GfG Practice
redirect icon

This algorithm efficiently locates all instances of a specific pattern within a text in linear time. If the length of the text is "n" and the length of the pattern is "m," then the total time taken is O(m + n), with a linear auxiliary space. It is worth noting that the time and auxiliary space of this algorithm is the same as the KMP algorithm, but this particular algorithm is simpler to comprehend. In this approach, we create a Z array as part of the process.

What is Z Array?

For a string str[0..n-1], Z array is of same length as string. An element Z[i] of Z array stores length of the longest substring starting from str[i] which is also a prefix of str[0..n-1]. The first entry of Z array is meaning less as complete string is always prefix of itself. 

Example:
Index 0 1 2 3 4 5 6 7 8 9 10 11
Text a a b c a a b x a a a z
Z values X 1 0 0 3 1 0 0 2 2 1 0

More Examples:
str = "aaaaaa"
Z[] = {x, 5, 4, 3, 2, 1}
str = "aabaacd"
Z[] = {x, 1, 0, 2, 1, 0, 0}
str = "abababab"
Z[] = {x, 0, 6, 0, 4, 0, 2, 0}

How is Z array helpful in Searching Pattern in Linear time? 
The idea is to concatenate pattern and text, and create a string "P$T" where P is pattern, $ is a special character should not be present in pattern and text, and T is text. Build the Z array for concatenated string. In Z array, if Z value at any point is equal to pattern length, then pattern is present at that point. 

Example:
Pattern P = "aab", Text T = "baabaa"
The concatenated string is = "aab$baabaa"
Z array for above concatenated string is {x, 1, 0, 0, 0, 3, 1, 0, 2, 1}.
Since length of pattern is 3, the value 3 in Z array indicates presence of pattern.

How to construct Z array? 
     A Simple Solution is to run two nested loops, the outer loop goes to every index and the inner loop finds length of the longest prefix that matches the substring starting at the current index. The time complexity of this solution is O(n2).
      We can construct Z array in linear time. 

The idea is to maintain an interval [L, R] which is the interval with max R such that [L,R] is prefix substring (substring which is also prefix).
Steps for maintaining this interval are as follows –
1) If i > R then there is no prefix substring that starts before i and ends after i, so we reset L and R and compute new [L,R] by comparing str[0..] to str[i..] and get Z[i] (= R-L+1).
2) If i <= R then let K = i-L, now Z[i] >= min(Z[K], R-i+1) because str[i..] matches with str[K..] for atleast R-i+1 characters (they are in [L,R] interval which we know is a prefix substring). Now two sub cases arise –
a) If Z[K] < R-i+1 then there is no prefix substring starting at str[i] (otherwise Z[K] would be larger) so Z[i] = Z[K] and interval [L,R] remains same.
b) If Z[K] >= R-i+1 then it is possible to extend the [L,R] interval thus we will set L as i and start matching from str[R] onwards and get new R then we will update interval [L,R] and calculate Z[i] (=R-L+1).

The algorithm runs in linear time because we never compare character less than R and with matching we increase R by one so there are at most T comparisons. In mismatch case, mismatch happen only once for each i (because of which R stops), that’s another at most T comparison making overall linear complexity.

Below is the implementation of Z algorithm for pattern searching. 

C++
// A C++ program that implements Z algorithm for pattern searching #include<iostream> using namespace std;  void getZarr(string str, int Z[]);  // prints all occurrences of pattern in text using Z algo void search(string &text, string &pattern) {     // Create concatenated string "P$T"     string concat = pattern + "$" + text;     int l = concat.length();      // Construct Z array     int Z[l];     getZarr(concat, Z);      // now looping through Z array for matching condition     for (int i = 0; i < l; ++i)     {         // if Z[i] (matched region) is equal to pattern         // length we got the pattern         if (Z[i] == pattern.length())             cout << "Pattern found at index "                 << i - pattern.length() -1 << endl;     } }  // Fills Z array for given string str[] void getZarr(string str, int Z[]) {     int n = str.length();     int L, R, k;      // [L,R] make a window which matches with prefix of s     L = R = 0;     for (int i = 1; i < n; ++i)     {         // if i>R nothing matches so we will calculate.         // Z[i] using naive way.         if (i > R)         {             L = R = i;              // R-L = 0 in starting, so it will start             // checking from 0'th index. For example,             // for "ababab" and i = 1, the value of R             // remains 0 and Z[i] becomes 0. For string             // "aaaaaa" and i = 1, Z[i] and R become 5             while (R<n && str[R-L] == str[R])                 R++;             Z[i] = R-L;             R--;         }         else         {             // k = i-L so k corresponds to number which             // matches in [L,R] interval.             k = i-L;              // if Z[k] is less than remaining interval             // then Z[i] will be equal to Z[k].             // For example, str = "ababab", i = 3, R = 5             // and L = 2             if (Z[k] < R-i+1)                 Z[i] = Z[k];              // For example str = "aaaaaa" and i = 2, R is 5,             // L is 0             else             {                 // else start from R and check manually                 L = i;                 while (R<n && str[R-L] == str[R])                     R++;                 Z[i] = R-L;                 R--;             }         }     } }  // Driver program int main() {     string text = "GEEKS FOR GEEKS";     string pattern = "GEEK";     search(text, pattern);     return 0; } 
Java
// A Java program that implements Z algorithm for pattern // searching class GFG {       //  prints all occurrences of pattern in text using     // Z algo     public static void search(String text, String pattern)     {          // Create concatenated string "P$T"         String concat = pattern + "$" + text;          int l = concat.length();          int Z[] = new int[l];          // Construct Z array         getZarr(concat, Z);          // now looping through Z array for matching condition         for(int i = 0; i < l; ++i){              // if Z[i] (matched region) is equal to pattern             // length we got the pattern              if(Z[i] == pattern.length()){                 System.out.println("Pattern found at index "                               + (i - pattern.length() - 1));             }         }     }      // Fills Z array for given string str[]     private static void getZarr(String str, int[] Z) {          int n = str.length();                  // [L,R] make a window which matches with          // prefix of s         int L = 0, R = 0;          for(int i = 1; i < n; ++i) {              // if i>R nothing matches so we will calculate.             // Z[i] using naive way.             if(i > R){                  L = R = i;                  // R-L = 0 in starting, so it will start                 // checking from 0'th index. For example,                 // for "ababab" and i = 1, the value of R                 // remains 0 and Z[i] becomes 0. For string                 // "aaaaaa" and i = 1, Z[i] and R become 5                  while(R < n && str.charAt(R - L) == str.charAt(R))                     R++;                                  Z[i] = R - L;                 R--;              }             else{                  // k = i-L so k corresponds to number which                 // matches in [L,R] interval.                 int k = i - L;                  // if Z[k] is less than remaining interval                 // then Z[i] will be equal to Z[k].                 // For example, str = "ababab", i = 3, R = 5                 // and L = 2                 if(Z[k] < R - i + 1)                     Z[i] = Z[k];                  // For example str = "aaaaaa" and i = 2, R is 5,                 // L is 0                 else{                   // else start from R and check manually                     L = i;                     while(R < n && str.charAt(R - L) == str.charAt(R))                         R++;                                          Z[i] = R - L;                     R--;                 }             }         }     }          // Driver program     public static void main(String[] args)      {         String text = "GEEKS FOR GEEKS";         String pattern = "GEEK";          search(text, pattern);     } }  // This code is contributed by PavanKoli. 
Python
# Python3 program that implements Z algorithm # for pattern searching  # Fills Z array for given string str[] def getZarr(string, z):     n = len(string)      # [L,R] make a window which matches     # with prefix of s     l, r, k = 0, 0, 0     for i in range(1, n):          # if i>R nothing matches so we will calculate.         # Z[i] using naive way.         if i > r:             l, r = i, i              # R-L = 0 in starting, so it will start             # checking from 0'th index. For example,             # for "ababab" and i = 1, the value of R             # remains 0 and Z[i] becomes 0. For string             # "aaaaaa" and i = 1, Z[i] and R become 5             while r < n and string[r - l] == string[r]:                 r += 1             z[i] = r - l             r -= 1         else:              # k = i-L so k corresponds to number which             # matches in [L,R] interval.             k = i - l              # if Z[k] is less than remaining interval             # then Z[i] will be equal to Z[k].             # For example, str = "ababab", i = 3, R = 5             # and L = 2             if z[k] < r - i + 1:                 z[i] = z[k]              # For example str = "aaaaaa" and i = 2,              # R is 5, L is 0             else:                  # else start from R and check manually                 l = i                 while r < n and string[r - l] == string[r]:                     r += 1                 z[i] = r - l                 r -= 1  # prints all occurrences of pattern  # in text using Z algo def search(text, pattern):      # Create concatenated string "P$T"     concat = pattern + "$" + text     l = len(concat)      # Construct Z array     z = [0] * l     getZarr(concat, z)      # now looping through Z array for matching condition     for i in range(l):          # if Z[i] (matched region) is equal to pattern         # length we got the pattern         if z[i] == len(pattern):             print("Pattern found at index",                        i - len(pattern) - 1)  # Driver Code if __name__ == "__main__":     text = "GEEKS FOR GEEKS"     pattern = "GEEK"     search(text, pattern)  # This code is contributed by # sanjeev2552 
C#
// A C# program that implements Z  // algorithm for pattern searching  using System;  class GFG {  // prints all occurrences of  // pattern in text using Z algo  public static void search(string text,                           string pattern) {      // Create concatenated string "P$T"      string concat = pattern + "$" + text;      int l = concat.Length;      int[] Z = new int[l];      // Construct Z array      getZarr(concat, Z);      // now looping through Z array     // for matching condition      for (int i = 0; i < l; ++i)     {          // if Z[i] (matched region) is equal          // to pattern length we got the pattern           if (Z[i] == pattern.Length)         {             Console.WriteLine("Pattern found at index " +                               (i - pattern.Length - 1));         }     } }  // Fills Z array for given string str[]  private static void getZarr(string str,                             int[] Z) {      int n = str.Length;      // [L,R] make a window which      // matches with prefix of s      int L = 0, R = 0;      for (int i = 1; i < n; ++i)     {          // if i>R nothing matches so we will          // calculate. Z[i] using naive way.          if (i > R)         {             L = R = i;              // R-L = 0 in starting, so it will start              // checking from 0'th index. For example,              // for "ababab" and i = 1, the value of R              // remains 0 and Z[i] becomes 0. For string              // "aaaaaa" and i = 1, Z[i] and R become 5              while (R < n && str[R - L] == str[R])             {                 R++;             }              Z[i] = R - L;             R--;          }         else         {              // k = i-L so k corresponds to number              // which matches in [L,R] interval.              int k = i - L;              // if Z[k] is less than remaining interval              // then Z[i] will be equal to Z[k].              // For example, str = "ababab", i = 3,              // R = 5 and L = 2              if (Z[k] < R - i + 1)             {                 Z[i] = Z[k];             }              // For example str = "aaaaaa" and              // i = 2, R is 5, L is 0              else             {                   // else start from R and                  // check manually                  L = i;                 while (R < n && str[R - L] == str[R])                 {                     R++;                 }                  Z[i] = R - L;                 R--;             }         }     } }  // Driver Code  public static void Main(string[] args) {     string text = "GEEKS FOR GEEKS";     string pattern = "GEEK";      search(text, pattern); } }  // This code is contributed by Shrikant13 
Javascript
// A JavaScript program that implements Z algorithm for // pattern searching  //  prints all occurrences of pattern in text using algo function search(text, pattern) {     // Create concatenated string "P$T"     let concat = pattern + "$" + text;      let l = concat.length;      let Z = new Array(l);      // Construct Z array     getZarr(concat, Z);      // now looping through Z array for matching condition     for (let i = 0; i < l; ++i) {          // if Z[i] (matched region) is equal to pattern         // length we got the pattern          if (Z[i] == pattern.length) {             console.log("Pattern found at index "                         + (i - pattern.length - 1));         }     } }  // Fills Z array for given string str[] function getZarr(str, Z) {     let n = str.length;      // [L,R] make a window which matches with     // prefix of s     let L = 0, R = 0;      for (let i = 1; i < n; ++i) {          // if i>R nothing matches so we will calculate.         // Z[i] using naive way.         if (i > R) {              L = R = i;              // R-L = 0 in starting, so it will start             // checking from 0'th index. For example,             // for "ababab" and i = 1, the value of R             // remains 0 and Z[i] becomes 0. For string             // "aaaaaa" and i = 1, Z[i] and R become 5              while (R < n && str[R - L] == str[R])                 R++;              Z[i] = R - L;             R--;         }         else {              // k = i-L so k corresponds to number which             // matches in [L,R] interval.             let k = i - L;              // if Z[k] is less than remaining interval             // then Z[i] will be equal to Z[k].             // For example, str = "ababab", i = 3, R = 5             // and L = 2             if (Z[k] < R - i + 1)                 Z[i] = Z[k];              // For example str = "aaaaaa" and i = 2, R is 5,             // L is 0             else {                  // else start from R and check manually                 L = i;                 while (R < n && str[R - L] == str[R])                     R++;                  Z[i] = R - L;                 R--;             }         }     } }  // Driver program let text = "GEEKS FOR GEEKS"; let pattern = "GEEK";  search(text, pattern); 

Output
Pattern found at index 0 Pattern found at index 10 


Time Complexity: O(m+n), where m is length of pattern and n is length of text.
Auxiliary Space: O(n)
 


Next Article
Finite Automata algorithm for Pattern Searching

U

Utkarsh Trivedi
Improve
Article Tags :
  • Pattern Searching
  • DSA
Practice Tags :
  • Pattern Searching

Similar Reads

    What is Pattern Searching ?
    Pattern searching in Data Structures and Algorithms (DSA) is a fundamental concept that involves searching for a specific pattern or sequence of elements within a given data structure. This technique is commonly used in string matching algorithms to find occurrences of a particular pattern within a
    5 min read
    Introduction to Pattern Searching - Data Structure and Algorithm Tutorial
    Pattern searching is an algorithm that involves searching for patterns such as strings, words, images, etc. We use certain algorithms to do the search process. The complexity of pattern searching varies from algorithm to algorithm. They are very useful when performing a search in a database. The Pat
    15+ min read
    Naive algorithm for Pattern Searching
    Given text string with length n and a pattern with length m, the task is to prints all occurrences of pattern in text. Note: You may assume that n > m. Examples:  Input:  text = "THIS IS A TEST TEXT", pattern = "TEST"Output: Pattern found at index 10 Input:  text =  "AABAACAADAABAABA", pattern =
    6 min read
    Rabin-Karp Algorithm for Pattern Searching
    Given two strings text and pattern string, your task is to find all starting positions where the pattern appears as a substring within the text. The strings will only contain lowercase English alphabets.While reporting the results, use 1-based indexing (i.e., the first character of the text is at po
    12 min read
    KMP Algorithm for Pattern Searching
    Given two strings txt and pat, the task is to return all indices of occurrences of pat within txt. Examples:Input: txt = "abcab", pat = "ab"Output: [0, 3]Explanation: The string "ab" occurs twice in txt, first occurrence starts from index 0 and second from index 3.Input: txt= "aabaacaadaabaaba", pat
    14 min read
    Z algorithm (Linear time pattern searching Algorithm)
    This algorithm efficiently locates all instances of a specific pattern within a text in linear time. If the length of the text is "n" and the length of the pattern is "m," then the total time taken is O(m + n), with a linear auxiliary space. It is worth noting that the time and auxiliary space of th
    13 min read
    Finite Automata algorithm for Pattern Searching
    Given a text txt[0..n-1] and a pattern pat[0..m-1], write a function search(char pat[], char txt[]) that prints all occurrences of pat[] in txt[]. You may assume that n > m.Examples: Input: txt[] = "THIS IS A TEST TEXT" pat[] = "TEST" Output: Pattern found at index 10 Input: txt[] = "AABAACAADAAB
    13 min read
    Boyer Moore Algorithm for Pattern Searching
    Pattern searching is an important problem in computer science. When we do search for a string in a notepad/word file, browser, or database, pattern searching algorithms are used to show the search results. A typical problem statement would be- " Given a text txt[0..n-1] and a pattern pat[0..m-1] whe
    15+ min read
    Aho-Corasick Algorithm for Pattern Searching
    Given an input text and an array of k words, arr[], find all occurrences of all words in the input text. Let n be the length of text and m be the total number of characters in all words, i.e. m = length(arr[0]) + length(arr[1]) + ... + length(arr[k-1]). Here k is total numbers of input words. Exampl
    15+ min read
    ­­kasai’s Algorithm for Construction of LCP array from Suffix Array
    Background Suffix Array : A suffix array is a sorted array of all suffixes of a given string. Let the given string be "banana". 0 banana 5 a1 anana Sort the Suffixes 3 ana2 nana ----------------> 1 anana 3 ana alphabetically 0 banana 4 na 4 na 5 a 2 nanaThe suffix array for "banana" :suffix[] = {
    15+ min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences