{"id":17471,"date":"2023-08-03T09:46:58","date_gmt":"2023-08-03T09:46:58","guid":{"rendered":"https:\/\/www.prepbytes.com\/blog\/?p=17471"},"modified":"2023-08-03T09:46:58","modified_gmt":"2023-08-03T09:46:58","slug":"kmp-algorithm-for-pattern-searching","status":"publish","type":"post","link":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/","title":{"rendered":"KMP Algorithm for Pattern Searching"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg\" alt=\"\" \/><\/p>\n<p>The KnuthMorrisPratt, KMP algorithm is a linear time string matching technique developed by Donald Knuth, Vaughan Pratt, and James H. Morris. It deals with the problem of locating instances of a pattern &#8216;p&#8217; within a larger string &#8216;S.&#8217; By avoiding unnecessary comparisons with elements of &#8216;S&#8217; that have already been involved in comparisons with the pattern &#8216;p,&#8217; the algorithm achieves a matching time complexity of O(n). This eliminates the need for backtracking on the string &#8216;S&#8217; and improves efficiency significantly.<\/p>\n<h2>Components of the KMP Algorithm<\/h2>\n<p><strong>1. The Prefix Function (\u03a0)<\/strong><br \/>\nThe prefix function, denoted as, contains information about how the pattern &#8216;p&#8217; matches its shifted versions. This information is critical for avoiding redundant pattern shifts during the matching process, which prevents backtracking on the string &#8216;S.&#8217;<\/p>\n<p><strong>2. The KMP Matcher<\/strong><br \/>\nThe KMP Matcher uses &#8216;S,&#8217; &#8216;p,&#8217; and the prefix function &#8221; as inputs to find occurrences of &#8216;p&#8217; in &#8216;S&#8217; and returns the number of shifts of &#8216;p&#8217; required to find these occurrences.<\/p>\n<h2>The Prefix Function (\u03a0)<\/h2>\n<p>The prefix function is computed using the following pseudocode:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691052562972-download%20%2815%29.png\" alt=\"\" \/><\/p>\n<p>The running time analysis reveals that the prefix function takes O(m) time to compute, where m is the length of the pattern &#8216;p.&#8217;<\/p>\n<h2>String Matching of KMP Algorithm<\/h2>\n<p>We will look at an example of how the KMP algorithm works in the case of string matching patterns.<\/p>\n<p><strong>Problem Statement<\/strong><br \/>\nWrite a function search(char pat[], char txt[]) that prints all occurrences of pat[] in txt[] given a text txt[0&#8230; N1] and a pattern pat[0&#8230; M1]. You may assume that N &gt; M.<\/p>\n<p><strong>For example:<\/strong><br \/>\ntxt = \u201cAABACDEFG\u201d and pat = \u201cAABA\u201d<\/p>\n<p><strong>Output<\/strong><br \/>\nPattern found at index 0<\/p>\n<h2>Algorithm for KMP Algorithm<\/h2>\n<ol>\n<li>\n<p>Preprocessing (Building the LPS array):<br \/>\nCreate an array LPS (Longest Prefix Suffix) of size n (length of the pattern).<br \/>\nInitialize two pointers, i and j, where i starts from 0 and j starts from 1.<\/p>\n<\/li>\n<li>\n<p>Building the LPS array:<br \/>\nSet LPS[0] to 0 since there is no proper prefix or suffix for a single character.<br \/>\nRepeat the following steps while j &lt; n:<br \/>\nIf pattern[i] == pattern[j], set LPS[j] = i + 1, increment both i and j.<br \/>\nIf pattern[i]!= pattern[j]:<br \/>\nIf i is not at the beginning (i &gt; 0), set i = LPS[i1].<br \/>\nIf i is at the beginning (i = 0), set LPS[j] = 0, increment j.<\/p>\n<\/li>\n<li>\n<p>Pattern Matching:<br \/>\nInitialize two pointers, i (index for the text) and j (index for the pattern), both starting from 0.<br \/>\nRepeat the following steps while i &lt; m (length of the text) and j &lt; n (length of the pattern):<br \/>\nIf text[i] == pattern[j], increment both i and j.<br \/>\nIf j == n, a match is found at index i j in the text, and j = LPS[j1].<br \/>\nIf text[i]!= pattern[j]:<br \/>\nIf j is not at the beginning (j &gt; 0), set j = LPS [j1].<br \/>\nIf j is at the beginning (j = 0), increment i.<\/p>\n<\/li>\n<li>\n<p>Repeat step 3 until i reach the end of the text or a match is found.<\/p>\n<\/li>\n<\/ol>\n<p>The KMP algorithm optimizes pattern matching by utilizing the information in the LPS array, which represents the longest proper prefix of the pattern that is also a proper suffix. This allows the algorithm to avoid unnecessary comparisons during the search, making it more efficient than naive pattern matching algorithms.<\/p>\n<h3>Code Implementation of KMP Algorithm<\/h3>\n\t\t\t\t\t\t\t<h3 style=\"margin-bottom:20px ;display:block;width:100%;margin-top:10px\">Code Implementation of KMP Algorithm <\/h3>\r\n\t\t\t\t\t\t\t\t<style>\r\n\t\t\t\t\r\n\t\t\t\t\t#tab_container_17335 {\r\n\toverflow:hidden;\r\n\tdisplay:block;\r\n\twidth:100%;\r\n\tborder:0px solid #ddd;\r\n\tmargin-bottom:30px;\r\n\t}\r\n\r\n#tab_container_17335 .tab-content{\r\n\tpadding:20px;\r\n\tborder: 1px solid #e6e6e6 !important;\r\n\tmargin-top: 0px;\r\n\tbackground-color:#ffffff !important;\r\n\tcolor: #000000 !important;\r\n\tfont-size:16px !important;\r\n\tfont-family: Open Sans !important;\r\n\t\r\n\t\tborder: 1px solid #e6e6e6 !important;\r\n\t}\r\n#tab_container_17335 .wpsm_nav-tabs {\r\n    border-bottom: 0px solid #ddd;\r\n}\r\n#tab_container_17335 .wpsm_nav-tabs > li.active > a, #tab_container_17335 .wpsm_nav-tabs > li.active > a:hover, #tab_container_17335 .wpsm_nav-tabs > li.active > a:focus {\r\n\tcolor: #000000 !important;\r\n\tcursor: default;\r\n\tbackground-color: #ffffff !important;\r\n\tborder: 1px solid #e6e6e6 !important;\r\n}\r\n\r\n#tab_container_17335 .wpsm_nav-tabs > li > a {\r\n    margin-right: 0px !important; \r\n    line-height: 1.42857143 !important;\r\n    border: 1px solid #d5d5d5 !important;\r\n    border-radius: 0px 0px 0 0 !important; \r\n\tbackground-color: #e8e8e8 !important;\r\n\tcolor: #000000 !important;\r\n\tpadding: 15px 18px 15px 18px !important;\r\n\ttext-decoration: none !important;\r\n\tfont-size: 14px !important;\r\n\ttext-align:center !important;\r\n\tfont-family: Open Sans !important;\r\n}\r\n#tab_container_17335 .wpsm_nav-tabs > li > a:focus {\r\noutline: 0px !important;\r\n}\r\n\r\n#tab_container_17335 .wpsm_nav-tabs > li > a:before {\r\n\tdisplay:none !important;\r\n}\r\n#tab_container_17335 .wpsm_nav-tabs > li > a:after {\r\n\tdisplay:none !important ;\r\n}\r\n#tab_container_17335 .wpsm_nav-tabs > li{\r\npadding:0px !important ;\r\nmargin:0px;\r\n}\r\n\r\n#tab_container_17335 .wpsm_nav-tabs > li > a:hover , #tab_container_17335 .wpsm_nav-tabs > li > a:focus {\r\n    color: #000000 !important;\r\n    background-color: #e8e8e8 !important;\r\n\tborder: 1px solid #d5d5d5 !important;\r\n\t\r\n}\r\n#tab_container_17335 .wpsm_nav-tabs > li > a .fa{\r\n\r\nmargin-right:5px !important;\r\n\r\nmargin-left:5px !important;\r\n\r\n\r\n}\r\n\r\n\t\t#tab_container_17335 .wpsm_nav-tabs a{\r\n\t\t\tbackground-image: none;\r\n\t\t\tbackground-position: 0 0;\r\n\t\t\tbackground-repeat: repeat-x;\r\n\t\t}\r\n\t\t\t\r\n\r\n\r\n#tab_container_17335 .wpsm_nav-tabs > li {\r\n    float: left;\r\n    margin-bottom: -1px !important;\r\n\tmargin-right:0px !important; \r\n}\r\n\r\n\r\n#tab_container_17335 .tab-content{\r\noverflow:hidden !important;\r\n}\r\n\r\n\r\n@media (min-width: 769px) {\r\n\r\n\t#tab_container_17335 .wpsm_nav-tabs > li{\r\n\t\tfloat:left !important ;\r\n\t\t\t\tmargin-right:-1px !important;\r\n\t\t\t\t\t}\r\n\t#tab_container_17335 .wpsm_nav-tabs{\r\n\t\tfloat:none !important;\r\n\t\tmargin:0px !important;\r\n\t}\r\n\r\n\t#tab_container_17335 .wpsm_nav-tabs > li {\r\n\t\t\t\t\r\n\t}\r\n\t#tab_container_17335 .wpsm_nav{\r\n\t\t\t}\r\n\r\n}\r\n\r\n\r\n\r\n@media (max-width: 768px) {\r\n\t#tab_container_17335 .wpsm_nav-tabs > li {\r\n\t\t\t\t\r\n\t}\r\n\t#tab_container_17335 .wpsm_nav{\r\n\t\t\t}\r\n}\r\n\r\n\r\n\t.wpsm_nav-tabs li:before{\r\n\t\tdisplay:none !important;\r\n\t}\r\n\r\n\t@media (max-width: 768px) {\r\n\t\t\t\t\r\n\t\t\t\t.wpsm_nav-tabs{\r\n\t\t\tmargin-left:0px !important;\r\n\t\t\tmargin-right:0px !important; \r\n\t\t\t\r\n\t\t}\r\n\t\t\t\t#tab_container_17335 .wpsm_nav-tabs > li{\r\n\t\t\tfloat:none !important;\r\n\t\t}\r\n\t\t\t\r\n\t}\t\t\t\t<\/style>\r\n\t\t\t\t<div id=\"tab_container_17335\" >\r\n\t \r\n\t\t\t\t\t<ul class=\"wpsm_nav wpsm_nav-tabs\" role=\"tablist\" id=\"myTab_17335\">\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<li role=\"presentation\"  class=\"active\"  onclick=\"do_resize()\">\r\n\t\t\t\t\t\t\t\t<a href=\"#tabs_desc_17335_1\" aria-controls=\"tabs_desc_17335_1\" role=\"tab\" data-toggle=\"tab\">\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-code\"><\/i> \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t<span>CPP<\/span>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t<\/a>\r\n\t\t\t\t\t\t\t<\/li>\r\n\t\t\t\t\t\t\t\t\t\t\t <\/ul>\r\n\r\n\t\t\t\t\t  <!-- Tab panes -->\r\n\t\t\t\t\t  <div class=\"tab-content\" id=\"tab-content_17335\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t <div role=\"tabpanel\" class=\"tab-pane  in active \" id=\"tabs_desc_17335_1\">\r\n\t\t\t\t\t\t\t\t<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">#include &lt;iostream&gt;\r\n#include &lt;vector&gt;\r\nusing namespace std;\r\n\r\n\/\/ Function to build the longest prefix suffix (lps) array for the pattern\r\nvoid computeLPSArray(const string&amp; pattern, vector&lt;int&gt;&amp; lps) {\r\n    int patternLen = pattern.length();\r\n    int len = 0; \/\/ Length of the previous longest prefix suffix\r\n\r\n    lps[0] = 0; \/\/ lps[0] is always 0\r\n\r\n    int i = 1;\r\n    while (i &lt; patternLen) {\r\n        if (pattern[i] == pattern[len]) {\r\n            len++;\r\n            lps[i] = len;\r\n            i++;\r\n        } else {\r\n            if (len != 0) {\r\n                len = lps[len - 1];\r\n            } else {\r\n                lps[i] = 0;\r\n                i++;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n\/\/ Function to perform pattern searching using the KMP algorithm\r\nvoid KMPSearch(const string&amp; text, const string&amp; pattern) {\r\n    int textLen = text.length();\r\n    int patternLen = pattern.length();\r\n\r\n    \/\/ Create lps array to store the longest prefix suffix values\r\n    vector&lt;int&gt; lps(patternLen, 0);\r\n\r\n    \/\/ Preprocess the pattern to build the lps array\r\n    computeLPSArray(pattern, lps);\r\n\r\n    int i = 0; \/\/ Index for text[]\r\n    int j = 0; \/\/ Index for pattern[]\r\n\r\n    while (i &lt; textLen) {\r\n        if (pattern[j] == text[i]) {\r\n            i++;\r\n            j++;\r\n        }\r\n\r\n        if (j == patternLen) {\r\n            cout &lt;&lt; \"Pattern found at index \" &lt;&lt; i - j &lt;&lt; endl;\r\n            j = lps[j - 1];\r\n        } else if (i &lt; textLen &amp;&amp; pattern[j] != text[i]) {\r\n            if (j != 0)\r\n                j = lps[j - 1];\r\n            else\r\n                i++;\r\n        }\r\n    }\r\n}\r\n\r\nint main() {\r\n    string text, pattern;\r\n    cout &lt;&lt; \"Enter the text: \";\r\n    cin &gt;&gt; text;\r\n\r\n    cout &lt;&lt; \"Enter the pattern to search: \";\r\n    cin &gt;&gt; pattern;\r\n\r\n    KMPSearch(text, pattern);\r\n\r\n    return 0;\r\n}\r\n<\/pre>\t\t\t\t\t\t <\/div>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t <\/div>\r\n\t\t\t\t\t \r\n\t\t\t\t <\/div>\r\n <script>\r\n\t\tjQuery(function () {\r\n\t\t\tjQuery('#myTab_17335 a:first').tab('show')\r\n\t\t});\r\n\t\t\r\n\t\t\t\tjQuery(function(){\r\n\t\t\tvar b=\"fadeIn\";\r\n\t\t\tvar c;\r\n\t\t\tvar a;\r\n\t\t\td(jQuery(\"#myTab_17335 a\"),jQuery(\"#tab-content_17335\"));function d(e,f,g){\r\n\t\t\t\te.click(function(i){\r\n\t\t\t\t\ti.preventDefault();\r\n\t\t\t\t\tjQuery(this).tab(\"show\");\r\n\t\t\t\t\tvar h=jQuery(this).data(\"easein\");\r\n\t\t\t\t\tif(c){c.removeClass(a);}\r\n\t\t\t\t\tif(h){f.find(\"div.active\").addClass(\"animated \"+h);a=h;}\r\n\t\t\t\t\telse{if(g){f.find(\"div.active\").addClass(\"animated \"+g);a=g;}else{f.find(\"div.active\").addClass(\"animated \"+b);a=b;}}c=f.find(\"div.active\");\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\r\n\t\tfunction do_resize(){\r\n\r\n\t\t\tvar width=jQuery( '.tab-content .tab-pane iframe' ).width();\r\n\t\t\tvar height=jQuery( '.tab-content .tab-pane iframe' ).height();\r\n\r\n\t\t\tvar toggleSize = true;\r\n\t\t\tjQuery('iframe').animate({\r\n\t\t\t    width: toggleSize ? width : 640,\r\n\t\t\t    height: toggleSize ? height : 360\r\n\t\t\t  }, 250);\r\n\r\n\t\t\t  toggleSize = !toggleSize;\r\n\t\t}\r\n\r\n\r\n\t<\/script>\r\n\t\t\t\t\r\n\t\t\t\n<p><strong>Input :<\/strong><br \/>\nText: &quot;ABABDABACDABABCABAB&quot;<br \/>\nPattern: &quot;ABABCABAB&quot;<\/p>\n<p><strong>Output<\/strong><\/p>\n<pre><code>Pattern found at index 10<\/code><\/pre>\n<p><strong>Conclusion<\/strong><br \/>\nWe use the KMP Algorithm to determine whether &#8216;P&#8217; appears in &#8216;T.&#8217; The pattern &#8216;P&#8217; is discovered to occur in the string &#8216;T&#8217; after 14 iterations. The total number of shifts required to find the match is 13  7 = 6 shifts. Finally, when compared to naive approaches, the KnuthMorrisPratt algorithm provides an efficient and powerful solution to the string matching problem.  The KMP algorithm allows for fast and accurate string matching in a variety of applications by utilizing the prefix function and avoiding unnecessary comparisons.<\/p>\n<h2>Frequently Asked Questions (FAQs)<\/h2>\n<p>Here are some of the frequently asked questions about the KMP algorithm<\/p>\n<p><strong>Q1: What is the KMP algorithm used for?<\/strong><br \/>\nThe KMP algorithm is a string matching algorithm used to find occurrences of a pattern within a text efficiently. It is particularly useful when you want to find multiple occurrences of the same pattern in a large text without unnecessary comparisons, making it more efficient than naive pattern matching algorithms.<\/p>\n<p><strong>Q2: How does the KMP algorithm achieve better efficiency than naive pattern matching?<\/strong><br \/>\nThe KMP algorithm achieves better efficiency by utilizing the information stored in the Longest Prefix Suffix (LPS) array. This array is precomputed based on the pattern and helps the algorithm avoid redundant character comparisons by skipping over known non-matching regions, leading to improved performance.<\/p>\n<p><strong>Q3: What is the time complexity of the Knuth-Morris-Pratt algorithm?<\/strong><br \/>\nThe time complexity of the KMP algorithm is O(m + n), where &#8216;m&#8217; is the length of the text and &#8216;n&#8217; is the length of the pattern. It is a linear time algorithm, making it very efficient even for large texts and patterns.<\/p>\n<p><strong>Q4: When to consider using the KMP algorithm over other string matching techniques?<\/strong><br \/>\nYou should consider using the KMP algorithm when you need to search for a specific pattern multiple times within a large text. It excels in scenarios where efficiency is crucial because of its linear time complexity, making it more suitable for larger datasets compared to naive approaches.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The KnuthMorrisPratt, KMP algorithm is a linear time string matching technique developed by Donald Knuth, Vaughan Pratt, and James H. Morris. It deals with the problem of locating instances of a pattern &#8216;p&#8217; within a larger string &#8216;S.&#8217; By avoiding unnecessary comparisons with elements of &#8216;S&#8217; that have already been involved in comparisons with the [&hellip;]<\/p>\n","protected":false},"author":52,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[138],"tags":[],"class_list":["post-17471","post","type-post","status-publish","format-standard","hentry","category-strings-interview-programming"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>KMP Algorithm for Pattern Searching<\/title>\n<meta name=\"description\" content=\"The KnuthMorrisPratt, KMP algorithm is a linear time string matching technique developed by Donald Knuth, Vaughan Pratt, and James H. Morris.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"KMP Algorithm for Pattern Searching\" \/>\n<meta property=\"og:description\" content=\"The KnuthMorrisPratt, KMP algorithm is a linear time string matching technique developed by Donald Knuth, Vaughan Pratt, and James H. Morris.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/\" \/>\n<meta property=\"og:site_name\" content=\"PrepBytes Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prepbytes0211\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-03T09:46:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg\" \/>\n<meta name=\"author\" content=\"Prepbytes\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Prepbytes\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/\"},\"author\":{\"name\":\"Prepbytes\",\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/person\/3f7dc4ae851791d5947a7f99df363d5e\"},\"headline\":\"KMP Algorithm for Pattern Searching\",\"datePublished\":\"2023-08-03T09:46:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/\"},\"wordCount\":882,\"commentCount\":0,\"publisher\":{\"@id\":\"http:\/\/43.205.93.38\/#organization\"},\"image\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg\",\"articleSection\":[\"Strings Interview Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/\",\"url\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/\",\"name\":\"KMP Algorithm for Pattern Searching\",\"isPartOf\":{\"@id\":\"http:\/\/43.205.93.38\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg\",\"datePublished\":\"2023-08-03T09:46:58+00:00\",\"description\":\"The KnuthMorrisPratt, KMP algorithm is a linear time string matching technique developed by Donald Knuth, Vaughan Pratt, and James H. Morris.\",\"breadcrumb\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#primaryimage\",\"url\":\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg\",\"contentUrl\":\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\/\/43.205.93.38\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Strings Interview Programming\",\"item\":\"https:\/\/prepbytes.com\/blog\/category\/strings-interview-programming\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"KMP Algorithm for Pattern Searching\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/43.205.93.38\/#website\",\"url\":\"http:\/\/43.205.93.38\/\",\"name\":\"PrepBytes Blog\",\"description\":\"ONE-STOP RESOURCE FOR EVERYTHING RELATED TO CODING\",\"publisher\":{\"@id\":\"http:\/\/43.205.93.38\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/43.205.93.38\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"http:\/\/43.205.93.38\/#organization\",\"name\":\"Prepbytes\",\"url\":\"http:\/\/43.205.93.38\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.prepbytes.com\/wp-content\/uploads\/2025\/07\/uzxxllgloialmn9mhwfe.webp\",\"contentUrl\":\"https:\/\/blog.prepbytes.com\/wp-content\/uploads\/2025\/07\/uzxxllgloialmn9mhwfe.webp\",\"width\":160,\"height\":160,\"caption\":\"Prepbytes\"},\"image\":{\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/prepbytes0211\/\",\"https:\/\/www.instagram.com\/prepbytes\/\",\"https:\/\/www.linkedin.com\/company\/prepbytes\/\",\"https:\/\/www.youtube.com\/channel\/UC0xGnHDrjUM1pDEK2Ka5imA\"]},{\"@type\":\"Person\",\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/person\/3f7dc4ae851791d5947a7f99df363d5e\",\"name\":\"Prepbytes\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/232042cd1a1ea0e982c96d2a2ec93fb70a8e864e00784491231e7bfe5a9e06b5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/232042cd1a1ea0e982c96d2a2ec93fb70a8e864e00784491231e7bfe5a9e06b5?s=96&d=mm&r=g\",\"caption\":\"Prepbytes\"},\"url\":\"https:\/\/prepbytes.com\/blog\/author\/gourav-jaincollegedekho-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"KMP Algorithm for Pattern Searching","description":"The KnuthMorrisPratt, KMP algorithm is a linear time string matching technique developed by Donald Knuth, Vaughan Pratt, and James H. Morris.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/","og_locale":"en_US","og_type":"article","og_title":"KMP Algorithm for Pattern Searching","og_description":"The KnuthMorrisPratt, KMP algorithm is a linear time string matching technique developed by Donald Knuth, Vaughan Pratt, and James H. Morris.","og_url":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/","og_site_name":"PrepBytes Blog","article_publisher":"https:\/\/www.facebook.com\/prepbytes0211\/","article_published_time":"2023-08-03T09:46:58+00:00","og_image":[{"url":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg","type":"","width":"","height":""}],"author":"Prepbytes","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Prepbytes","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#article","isPartOf":{"@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/"},"author":{"name":"Prepbytes","@id":"http:\/\/43.205.93.38\/#\/schema\/person\/3f7dc4ae851791d5947a7f99df363d5e"},"headline":"KMP Algorithm for Pattern Searching","datePublished":"2023-08-03T09:46:58+00:00","mainEntityOfPage":{"@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/"},"wordCount":882,"commentCount":0,"publisher":{"@id":"http:\/\/43.205.93.38\/#organization"},"image":{"@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#primaryimage"},"thumbnailUrl":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg","articleSection":["Strings Interview Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/","url":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/","name":"KMP Algorithm for Pattern Searching","isPartOf":{"@id":"http:\/\/43.205.93.38\/#website"},"primaryImageOfPage":{"@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#primaryimage"},"image":{"@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#primaryimage"},"thumbnailUrl":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg","datePublished":"2023-08-03T09:46:58+00:00","description":"The KnuthMorrisPratt, KMP algorithm is a linear time string matching technique developed by Donald Knuth, Vaughan Pratt, and James H. Morris.","breadcrumb":{"@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#primaryimage","url":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg","contentUrl":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1691055013265-KMP%20Algorithm%20for%20Pattern%20Searching.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/prepbytes.com\/blog\/kmp-algorithm-for-pattern-searching\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/43.205.93.38\/"},{"@type":"ListItem","position":2,"name":"Strings Interview Programming","item":"https:\/\/prepbytes.com\/blog\/category\/strings-interview-programming\/"},{"@type":"ListItem","position":3,"name":"KMP Algorithm for Pattern Searching"}]},{"@type":"WebSite","@id":"http:\/\/43.205.93.38\/#website","url":"http:\/\/43.205.93.38\/","name":"PrepBytes Blog","description":"ONE-STOP RESOURCE FOR EVERYTHING RELATED TO CODING","publisher":{"@id":"http:\/\/43.205.93.38\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/43.205.93.38\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"http:\/\/43.205.93.38\/#organization","name":"Prepbytes","url":"http:\/\/43.205.93.38\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/43.205.93.38\/#\/schema\/logo\/image\/","url":"https:\/\/blog.prepbytes.com\/wp-content\/uploads\/2025\/07\/uzxxllgloialmn9mhwfe.webp","contentUrl":"https:\/\/blog.prepbytes.com\/wp-content\/uploads\/2025\/07\/uzxxllgloialmn9mhwfe.webp","width":160,"height":160,"caption":"Prepbytes"},"image":{"@id":"http:\/\/43.205.93.38\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/prepbytes0211\/","https:\/\/www.instagram.com\/prepbytes\/","https:\/\/www.linkedin.com\/company\/prepbytes\/","https:\/\/www.youtube.com\/channel\/UC0xGnHDrjUM1pDEK2Ka5imA"]},{"@type":"Person","@id":"http:\/\/43.205.93.38\/#\/schema\/person\/3f7dc4ae851791d5947a7f99df363d5e","name":"Prepbytes","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/43.205.93.38\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/232042cd1a1ea0e982c96d2a2ec93fb70a8e864e00784491231e7bfe5a9e06b5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/232042cd1a1ea0e982c96d2a2ec93fb70a8e864e00784491231e7bfe5a9e06b5?s=96&d=mm&r=g","caption":"Prepbytes"},"url":"https:\/\/prepbytes.com\/blog\/author\/gourav-jaincollegedekho-com\/"}]}},"_links":{"self":[{"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/posts\/17471","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/comments?post=17471"}],"version-history":[{"count":2,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/posts\/17471\/revisions"}],"predecessor-version":[{"id":17490,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/posts\/17471\/revisions\/17490"}],"wp:attachment":[{"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/media?parent=17471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/categories?post=17471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/tags?post=17471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}