串的模式匹配,即在给定主串S中找到等于子串T的过程称为模式匹配。T称为模式。
串的匹配算法有两种:简单匹配算法(也称BF算法)和KMP匹配算法。
int i =pos ; j =1 ; while( i <= S[0] && j<T[0]) if(S[i]==T[j]) { i++ ; j ++; } else { i = i-j+2 ; j=1 ; } //此处为回溯 +2是因为j比已查的字符数多1,即减j的时候多减了个1,然后S中pos位置已经查了故i+1,
即 i - j +2 ; 其也可直接用 i = pos+1 ; j=1 ;代替。
if (j>t[0]) return ( i-t[0]) ; else return 0 ;
KMP算法思想:
先求出next[j]表,然后根据next[b]进行匹配。匹配思想为:
令i的初值为pos ,j 的初值为1,在匹配过程中,s[i] = t[j] ,则 i++ ,j++
若 不等,则i不变,j进行回溯,即 j = next [ j ] ;
回溯后有两种情况:
1. j退到某个next值时,字符比较相等,则i++,j++继续进行匹配;
2. j退到值为0,(即模式的第一个字符失配),此时也需要i++ , j++ ;即j的值变为1
算法描述:s为主串,t为子串,即模式
int i = pos , j =1 ;
while( i<= s[0] && j<= t[0])
if ( j ==0 || s[i] == t[j]) { i++ ; j++ ; }
else j = next[j] ;
if ( j>t[0] ) return i-t[0] ; //返回找到的子串第一个字符在主串中的位置。
特殊法验证: 在 abcdabdcf 中找寻 abd
123456789 , i的值在匹配完之后为8, t[0] = 3 , return 5 ; 正确;
next函数值获取算法(只与模式t有关):
int i =1 , j = 0 ;
next[1] =0 ;
while( i<t[0] )
if (j==0 || t[i] == t[j]) { i++ ; j++ ; j = next[j] }
else j = next[i] ;