Question
In the Knuth-Morris-Pratt (KMP) algorithm, the Longest
Proper Prefix Suffix (LPS) array lps[] is crucial. When pat[i] and pat[len] match, len is incremented and lps[i] is set to len. What happens when pat[i] and pat[len] *do not* match and len is not 0? void computeLPSArray(char* pat, int M, int* lps) { ┬а ┬а int len = 0; ┬а ┬а lps[0] = 0; ┬а ┬а int i = 1; ┬а ┬а while (i < M) { ┬а ┬а ┬а ┬а if (pat[i] == pat[len]) { ┬а ┬а ┬а ┬а ┬а ┬а len++; ┬а ┬а ┬а ┬а ┬а ┬а lps[i] = len; ┬а ┬а ┬а ┬а ┬а ┬а i++; ┬а ┬а ┬а ┬а } else { // (pat[i] != pat[len]) ┬а ┬а ┬а ┬а ┬а ┬а if (len != 0) { ┬а ┬а ┬а ┬а ┬а ┬а ┬а ┬а _________; // Line to complete ┬а ┬а ┬а ┬а ┬а ┬а } else { // if (len == 0) ┬а ┬а ┬а ┬а ┬а ┬а ┬а ┬а lps[i] = 0; ┬а ┬а ┬а ┬а ┬а ┬а ┬а ┬а i++; ┬а ┬а ┬а ┬а ┬а ┬а } ┬а ┬а ┬а ┬а } ┬а ┬а } }Solution
тАв Concept: The Knuth-Morris-Pratt (KMP) algorithm uses a precomputed Longest Proper Prefix Suffix (LPS) array to efficiently search for a pattern within a text. The LPS array lps[i] stores the length of the longest proper prefix of pat[0...i] that is also a suffix of pat[0...i]. тАв Code Analysis: o The while loop builds the lps array. o When pat[i] == pat[len], len is incremented, and lps[i] is set to the new len. o When pat[i] != pat[len] and len != 0, it means the current character pat[i] does not extend the current prefix-suffix match. We need to "fall back" to a shorter possible prefix-suffix match. тАв Explanation of Correct Answer (B): len = lps[len - 1]; o When pat[i] does not match pat[len], and len is not 0, it means we had a prefix of length len that matched a suffix. Since pat[i] doesn't extend this match, we look for the next shortest proper prefix of pat[0...len-1] that is also a suffix of pat[0...len-1]. The length of this next shortest match is precisely stored in lps[len - 1]. By setting len = lps[len - 1], we effectively shift our comparison point in the pattern to try and find a shorter matching prefix.
тАШ рд╢рд╛рдВрддтАЩ рдХрд╛ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╢рдмреНрдж рдХреМрди рд╕рд╛ рд╣реИ ?
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рдореЗрдВ , рдЪрд╛рд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЪя┐╜...
'рд╕реБрд░' рдХрд┐рд╕рдХрд╛ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╣реИ?
тАШ рдЖрд╕рдорд╛рди рдЫреВрдирд╛тАЩ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рд╕рд╣реА рдЕрд░реНрде рд╣реИ:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рджрд┐рдП рдЧрдП рд╡рд╛рдХреНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреЗ рдиреАя┐╜...
рдРрд╕реЗ рд╢рдмреНрдж рдЬрд┐рдирдХреЗ рд╕рд╛рд░реНрдердХ рдЦрдВрдб рди рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВ рдЙрдиреНрд╣реЗрдВ рд╢рдмреНрдж рдХрд╣я┐╜...
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдХреМрдирд╕рд╛ рд╢рдмреНрдж 'рдШрд░' рдХрд╛ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рдирд╣реАрдВ-
тАШрдирд┐рд╡рд╛рд░рдгтАЩ рдХрд╛ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рдХреМрди-рд╕рд╛ рд╣реИ ?┬а
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рдореЗрдВ , рджрд┐рдП рдЧрдП рдЪрд╛рд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ , рдЙрд╕ рд╡рд┐рдХя┐╜...
рдмреЗрдЗрдЬрд╝реНрдЬрд╝рдд рдХрд░рдиреЗ рдХреЗ рдЕрд░реНрде рдореЗрдВ рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдкреНрд░...