本文主要对字符串的算法进行分析和整理,比如KMP,Manacher,Robin-karp,Sunny等算法。

Robin-karp, manacher, KMP算法

其中kmp的模板可以看下面的:

https://leetcode-cn.com/problems/shortest-palindrome/solution/zui-duan-hui-wen-chuan-by-leetcode-solution/

关于c++,这种写法:

int ViolentMatch(char* s, char* p)
{
	int sLen = strlen(s);
	int pLen = strlen(p);
 
	int i = 0;
	int j = 0;
	while (i < sLen && j < pLen)
	{
		if (s[i] == p[j])
		{
			//①如果当前字符匹配成功(即S[i] == P[j]),则i++,j++    
			i++;
			j++;
		}
		else
		{
			//②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0    
			i = i - j + 1;
			j = 0;
		}
	}
	//匹配成功,返回模式串p在文本串s中的位置,否则返回-1
	if (j == pLen)
		return i - j;
	else
		return -1;
}

kmp的next数组求法:

private function getNext($word): array
{
    $next = [-1];
    $len = strlen($word);
    $k = -1;
    $j = 0;
    while ($j < $len - 1) {
        if ($k == -1 || $word[$j] == $word[$k]) {
            $next[++$j] = ++$k;
        } else {
            $k = $next[$k];
        }
    }
	return $next;
}

字符串算法:1392. Longest Happy Prefix

思路:Robin-Karp算法