什么是kmp算法?
——这是一个解决字符串匹配的一个算法
例子:
文本串:aabaabaaf
模式串:aabaaf
暴力解法:两层for循环,第一层遍历第文本串,第二层,遍历模式串,逐个匹配,当遇到不匹配的时候,重新匹配
重新匹配是指:文本串中的指针会跳,回到起始位置的下一个位置,然后重新开始匹配
kmp算法:就是一次遍历中,在文本串中找到模式串
原理是?
——在暴力破解中,我们是回到初始位置的下一个字符串开始,但是我们已经遍历过的字符串中可能会出现重复的元素,那么我们就可以跳过它,
我认为这道题也是双指针的一种用法,也可以说kmp算法是双指针的一种用法
——一个指针是文本字符串的,另外一个是模式字符串的,而暴力解法中呢,就是第一个指针不是一直往前走,而是遇到不同的时候,两个指针都往回跳,
而kmp则是第一个指针只往前走,而第二个指针回跳
我们如何知道要跳过多少?看什么?
——我们需要一个前缀表来记录,每一个字符串的最长相等前后缀(的长度)是多少,我们要看不相同元素的前一个元素的最长相等前后缀是多少,
前缀是指除尾字符串以外的所有子字符串
后缀是除首元素之外所有字符串
为什么这样子可以?
——因为第一个指针不动,第二个指针是取第一个指针前一个的最长相等前后缀第二个指针的起始位置,这个长度实际是指第二个指针在模式串跳过多少个元素后进行比较,因为是相等前后缀的原因,所以说,这跳过的x个元素,必定会和第一指针前的x个元素相等