KMP
废话不多说,直接上代码
int _i = start_pos;
int _j = 0;
while (_j < P.Length && _i < S.Length)
{
if (_j == -1 || S[_i] == P[_j])
{
_j++;
_i++;
}
else
{
_j = _next[_j];
}
}
if (_j == S.Length)
{
return _i - _j;
}
return -1;
看起来和计算数组差不多,唯一不同就是 while 循环里面的 else 这边回溯的就是我们的next数组的位置,字符串发生匹配,我们就正常的++,失配就回溯数组中的位置,_j 是我们的模式串的位置,一般匹配成功,那么我们的长度是和模式串长度一样。所以我们要从-1开始,因为-1是其实位置,所以我们直接发生匹配。_i 和 _j 起始位置都是 0 ,可以根据用户输入来决定匹配位置起始,这个代码很简单,就是我们在说next数组时的常规匹配,不同是回溯位置而已。
kmp不是最优的解法,后续有空再写