KMP算法_读书笔记

时间:2022-05-29 03:36:07

下面是KMP算法的实现伪代码:

KMP_MATCHER ( T, P )
. n = T.length
. m = P.length
. next = COMPUTE_PREFIX_FUNCTION ( P )
. q = //number of characters matched
. for i = to n //scan the text from left to right
. while q > and P [q+] <> T[i]
//next character does not match
. q = next[q]
. if P[q+ ] == T [i] // next character matches
. q = q+
. if q == m // is all the characters in P matched
. finish
. q = next[q] // look for the next matcher COMPUTE_PREFIX_FUNCTION ( P )
m = P.length
let next be a new array with length of m
next[] =
k =
for q = to m
while k> and P[k+] <> P[q]
k = next [k]
if P[k+] == P[q]
k = k+
next[q] = k
return next

在不同的情况下,对应的next下标是不相同的,当然和个人编写代码的习惯也是有很大的关系,

下面的代码是实现 对 子串 进行 next 的初始化的代码,

在实现中,next 和 子串 的下标 是从 0开始计算的。

#include <stdio.h>
#include <string.h> int main ( )
{
int len ;
char S[] ;
int next[] ; int k , i ; memset( S , , sizeof(S) ) ;
memset (next , , sizeof (next) ) ; scanf("%s" , S) ; len = strlen(S) ; next[] = ; k = ; for ( i = ; i < len ; i++ )
{
while ( k > && S[k] != S [i] )
{
k = next[k] ;
}
if ( S[k] == S[i] )
{
k = k+ ;
} next[i] = k ;
} for ( i = ; i < len ; i++ )
{
printf("next[%d] : %d\n", i,next[i]) ;
} return ;
}

而下面的代码实现的是, 基于KMP 算法的 对字符串的匹配 代码。

LZ 并没有将 next 数组初始化操作写成一个 单独的函数,而是将它作为 整个main 函数中的一个处理步骤。

#include <stdio.h>
#include <string.h> int main ()
{
int len_s , len_t ;
char S[], T[] ;
int next[] ; int k, i ; scanf("%s %s", S , T) ; len_s = strlen(S) ;
len_t = strlen(T) ; memset(next, , sizeof(next) ) ; //initial next array next[] = ; for (k = , i = ; i < len_s ; i++ )
{
while ( k > && S[k] != S[i] )
k = next[k] ;
if ( S[k] == S[i] )
k = k+ ;
next[i] = k ;
} //show next
for ( i = ; i < len_s ; i++ )
{
printf(" next %d \n", next[i]);
} //Main match for (k= , i = ; i < len_t ; i++ )
{
while ( k > && S[k] != T [i] )
k = next[k] ;
if ( S[k] == T[i] )
k = k+ ; if ( k == len_s- )
{
printf("YES\n") ;
break ;
}
} if (i >= len_t )
printf("NO\n") ;
return ;
}

-------------------------ACM_KMP-----------------------------------

All in All
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 26253   Accepted: 10650

Description

You have devised a new encryption technique which encodes a message by inserting between its characters randomly generated strings in a clever way. Because of pending patent issues we will not discuss in detail how the strings are generated and inserted into the original message. To validate your method, however, it is necessary to write a program that checks if the message is really encoded in the final string.

Given two strings s and t, you have to decide whether s is a
subsequence of t, i.e. if you can remove characters from t such that the
concatenation of the remaining characters is s.

Input

The
input contains several testcases. Each is specified by two strings s, t
of alphanumeric ASCII characters separated by whitespace.The length of s
and t will no more than 100000.

Output

For each test case output "Yes", if s is a subsequence of t,otherwise output "No".

Sample Input

sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter

Sample Output

Yes
No
Yes
No
----------------------------IDEA-------------------------------------
可以创建两层循环:
循环1{
    接收两个字符串 于 S , T 并调用 strlen 计算出 字符串的长度 s:len_s t:len_t
  
    counter = 0 ;
   for ( i = 0 ; i < len_t ; i++ )
   {
      if ( S[counter] == T[i] )
      {
        if ( counter == len_s -1 )//is S finished?
        { 
         break ;
        
        }
        counter++ ;

      }
  }
 
    if ( counter == len_s-1 ) {printf YES break}
    if ( counter != len_s-1 ) {printf NO break }
}
    
------------------------------SRC-------------------------------------
#include <stdio.h>
#include <string.h> int main()
{
char S[],T[] ;
int s, t;
int counter ,i; while ( ~scanf("%s %s", S,T) )
{
s = strlen ( S ) ;
t = strlen ( T ) ;
counter = ; for ( i = ; i < t ; i++ )
{
if ( T[i] == S[counter] )
{
if (counter == (s-))
{ break ;
} counter++ ;
}
} printf("%d t %d" , i, t) ; if ( counter == s - ) printf("Yes\n") ;
else printf("No\n") ; } return ;
}

//(╰_╯)#  为毛不过呢!!