KEMBAR78
kmp_algorithm (string matching) | PPTX
boring
boring
AABA AABA
AABA
length of the longest
proper suffix which is also the proper prefix for a substring from
zero to ‘i’.
• Proper Prefixes of “aababaab” : “a” , “aa” , “aab” , “aaba” , “aabab”
, “aababa” and “aababaa”.
• Proper Suffixes of “aababaab” : “b” , “ab” , “aab” , “baab” , “abaab”,
“babaab” and “ababaab”.
• There is only one common suffix and prefix : “aab”. Length is 3.
Index 0 1 2 3 4 5
Pattern a b c a b y
LPS Array 0 0 0 1 2 0
Index 0 1 2 3 4 5 6 7 8
Pattern a a b a a b a a a
LPS Array 0 1 0 1 2 3 4 5 2
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0
lps[0] initialized to zero
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0
len=0, i=1
pat[i] != pat[len]
Since len=0, lps[i] = 0
i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1
len=0, i=2
pat[i] == pat[len]
lps[i] = len + 1
i++, len++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2
len=1, i=3
pat[i] == pat[len]
lps[i] = len + 1
i++, len++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3
len=2, i=4
pat[i] == pat[len]
lps[i] = len + 1
i++, len++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3
len=3, i=5
pat[i] != pat[len]
len=lps[len-1]
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3
len=1, i=5
pat[i] != pat[len]
len=lps[len-1]
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0
len=0, i=5
pat[i] != pat[len]
Since len=0, lps[i]=0
i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1
len=0, i=6
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2
len=1, i=7
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3
len=2, i=8
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4
len=3, i=9
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5
len=4, i=10
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5 6
len=5, i=11
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5 6 7
len=6, i=12
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8
len=7, i=13
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9
len=8, i=14
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10
len=9, i=15
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11
len=10, i=16
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11
len=11, i=17
pat[i] != pat[len]
len=lps[len-1]
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11
len=5, i=17
pat[i] != pat[len]
len=lps[len-1]
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Pattern a c a c a b a c a c a b a c a c a c
LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11 4
len=3, i=17
pat[i] == pat[len]
lps[i]=len+1
len++, i++
Index 0 1 2 3 4 5 6 7 8 9 10 11
String a b x a b c a b c a b y
Index 0 1 2 3 4 5
Pattern a b c a b y
LPS Array 0 0 0 1 2 0
i
j
start
Index 0 1 2 3 4 5 6 7 8 9 10 11
String a b x a b c a b c a b y
Index 0 1 2 3 4 5
Pattern a b c a b y
LPS Array 0 0 0 1 2 0
i
j
start
Index 0 1 2 3 4 5 6 7 8 9 10 11
String a b x a b c a b c a b y
Index 0 1 2 3 4 5
Pattern a b c a b y
LPS Array 0 0 0 1 2 0
Now, since Pattern[j] doesn’t match with String[i], j=LPS[j-1], start=i-LPS[j-1].
i
j
start
Index 0 1 2 3 4 5 6 7 8 9 10 11
String a b x a b c a b c a b y
Index 0 1 2 3 4 5
Pattern a b c a b y
LPS Array 0 0 0 1 2 0
i
j
Pattern[j] is still not equal to String[i].And since j=0, we increment ‘i’ and ‘start’ this time.
start
Index 0 1 2 3 4 5 6 7 8 9 10 11
String a b x a b c a b c a b y
Index 0 1 2 3 4 5
Pattern a b c a b y
LPS Array 0 0 0 1 2 0
i
j
start
Index 0 1 2 3 4 5 6 7 8 9 10 11
String a b x a b c a b c a b y
Index 0 1 2 3 4 5
Pattern a b c a b y
LPS Array 0 0 0 1 2 0
i
j
Again String[i]!=Pattern[j].Therefore j=LPS[j-1]. start=i-LPS[j-1].
start
Index 0 1 2 3 4 5 6 7 8 9 10 11
String a b x a b c a b c a b y
Index 0 1 2 3 4 5
Pattern a b c a b y
LPS Array 0 0 0 1 2 0
i
j
start
Index 0 1 2 3 4 5 6 7 8 9 10 11
String a b x a b c a b c a b y
Index 0 1 2 3 4 5
Pattern a b c a b y
LPS Array 0 0 0 1 2 0
i
j
start
We reached the end of the pattern. Hence the pattern is found at index ‘start’.
kmp_algorithm (string matching)

kmp_algorithm (string matching)

  • 2.
  • 4.
    length of thelongest proper suffix which is also the proper prefix for a substring from zero to ‘i’.
  • 5.
    • Proper Prefixesof “aababaab” : “a” , “aa” , “aab” , “aaba” , “aabab” , “aababa” and “aababaa”. • Proper Suffixes of “aababaab” : “b” , “ab” , “aab” , “baab” , “abaab”, “babaab” and “ababaab”. • There is only one common suffix and prefix : “aab”. Length is 3.
  • 6.
    Index 0 12 3 4 5 Pattern a b c a b y LPS Array 0 0 0 1 2 0 Index 0 1 2 3 4 5 6 7 8 Pattern a a b a a b a a a LPS Array 0 1 0 1 2 3 4 5 2
  • 8.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 lps[0] initialized to zero
  • 9.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 len=0, i=1 pat[i] != pat[len] Since len=0, lps[i] = 0 i++
  • 10.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 len=0, i=2 pat[i] == pat[len] lps[i] = len + 1 i++, len++
  • 11.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 len=1, i=3 pat[i] == pat[len] lps[i] = len + 1 i++, len++
  • 12.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 len=2, i=4 pat[i] == pat[len] lps[i] = len + 1 i++, len++
  • 13.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 len=3, i=5 pat[i] != pat[len] len=lps[len-1]
  • 14.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 len=1, i=5 pat[i] != pat[len] len=lps[len-1]
  • 15.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 len=0, i=5 pat[i] != pat[len] Since len=0, lps[i]=0 i++
  • 16.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 len=0, i=6 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 17.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 len=1, i=7 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 18.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 len=2, i=8 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 19.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 len=3, i=9 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 20.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 len=4, i=10 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 21.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 6 len=5, i=11 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 22.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 len=6, i=12 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 23.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 len=7, i=13 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 24.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 len=8, i=14 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 25.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 len=9, i=15 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 26.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11 len=10, i=16 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 27.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11 len=11, i=17 pat[i] != pat[len] len=lps[len-1]
  • 28.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11 len=5, i=17 pat[i] != pat[len] len=lps[len-1]
  • 29.
    Index 0 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Pattern a c a c a b a c a c a b a c a c a c LPS 0 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11 4 len=3, i=17 pat[i] == pat[len] lps[i]=len+1 len++, i++
  • 31.
    Index 0 12 3 4 5 6 7 8 9 10 11 String a b x a b c a b c a b y Index 0 1 2 3 4 5 Pattern a b c a b y LPS Array 0 0 0 1 2 0 i j start
  • 32.
    Index 0 12 3 4 5 6 7 8 9 10 11 String a b x a b c a b c a b y Index 0 1 2 3 4 5 Pattern a b c a b y LPS Array 0 0 0 1 2 0 i j start
  • 33.
    Index 0 12 3 4 5 6 7 8 9 10 11 String a b x a b c a b c a b y Index 0 1 2 3 4 5 Pattern a b c a b y LPS Array 0 0 0 1 2 0 Now, since Pattern[j] doesn’t match with String[i], j=LPS[j-1], start=i-LPS[j-1]. i j start
  • 34.
    Index 0 12 3 4 5 6 7 8 9 10 11 String a b x a b c a b c a b y Index 0 1 2 3 4 5 Pattern a b c a b y LPS Array 0 0 0 1 2 0 i j Pattern[j] is still not equal to String[i].And since j=0, we increment ‘i’ and ‘start’ this time. start
  • 35.
    Index 0 12 3 4 5 6 7 8 9 10 11 String a b x a b c a b c a b y Index 0 1 2 3 4 5 Pattern a b c a b y LPS Array 0 0 0 1 2 0 i j start
  • 36.
    Index 0 12 3 4 5 6 7 8 9 10 11 String a b x a b c a b c a b y Index 0 1 2 3 4 5 Pattern a b c a b y LPS Array 0 0 0 1 2 0 i j Again String[i]!=Pattern[j].Therefore j=LPS[j-1]. start=i-LPS[j-1]. start
  • 37.
    Index 0 12 3 4 5 6 7 8 9 10 11 String a b x a b c a b c a b y Index 0 1 2 3 4 5 Pattern a b c a b y LPS Array 0 0 0 1 2 0 i j start
  • 38.
    Index 0 12 3 4 5 6 7 8 9 10 11 String a b x a b c a b c a b y Index 0 1 2 3 4 5 Pattern a b c a b y LPS Array 0 0 0 1 2 0 i j start We reached the end of the pattern. Hence the pattern is found at index ‘start’.