算法核心思想: 利用已经部分配对的有效信息,让主串i指针不回溯,通过每次确定子串j指针的回溯位置,使得子串(模式串)重新匹配时尽量移动到最佳位置,以减少不必要的回溯。 int* GetNext(char Str[]) { int* Next = (int*)malloc(sizeof(int) * ...
分类:
编程语言 时间:
2020-07-05 19:36:49
阅读次数:
74
引入 现在我们面临这样一个问题:有一个主串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? Brute-Force(暴力求解) 思路 如果用暴力匹配的思路,并假设现在主串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即$S_i = P_$),则$i++,j++ ...
分类:
编程语言 时间:
2020-06-30 22:38:23
阅读次数:
70
KMP看书是很难懂的......相信我,推荐一个易懂视频 https://www.bilibili.com/video/BV1jb411V78H?from=search&seid=9395428282072905815 1.为什么只用研究模式串?因为发生不匹配时,模式串当前下标之前的内容和被查找串的 ...
分类:
编程语言 时间:
2020-06-10 12:57:56
阅读次数:
86
KMP算法 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next ...
分类:
编程语言 时间:
2020-05-30 20:21:12
阅读次数:
61
首先看看kmp的出现原因:暴力匹配算法 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,j+ ...
分类:
编程语言 时间:
2020-05-25 09:41:23
阅读次数:
63
问题: S代表原字符串,P代表模式串,包含* (匹配0或者多个)和?(匹配一个) 思路:动态规划 dp[i][j] 代表 S的前i个字符和P的前j个字符是否匹配, 最后返回dp[s.length()][p.length()] p[j-1]==* 则 dp[i][j] = dp[i-1][j] || ...
分类:
其他好文 时间:
2020-05-15 20:34:58
阅读次数:
77
字符串匹配是指一类在T文本串中查找P模式串的过程 一、暴力匹配 就是扫描T串中所有字符,对第i个字符开始的strlen(p)个字符都尝试与P串进行匹配,一旦失败,i++并继续进行这样的匹配直至匹配成功或i > strlen(t)(即匹配失败) 很显然,这样做的时间复杂度是O(|P||T|),对于特别 ...
分类:
编程语言 时间:
2020-05-13 10:21:15
阅读次数:
85
滑动窗口法 思路: 将要匹配的子串逐一和模式串比较。 ababcab abca 代码(利用Python自带字符串比对): class Solution: def strStr(self, haystack: str, needle: str) -> int: L, n = len(needle), ...
分类:
其他好文 时间:
2020-05-10 23:27:16
阅读次数:
89
这一章,我们主要学习了串的知识点,最主要的是BF算法和KMP算法,BF简单粗暴,但时间的开销比较高,在BF算法里,匹配过程简单,注意指针开始匹配的语句是i=i-j+2;然后就是要多多回归课本。 还有就是kmp算法,KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的 ...
分类:
其他好文 时间:
2020-05-06 01:32:58
阅读次数:
55
数据结构第四章学习的是串,数组和广义表 串的定义其实在c++学习中就有所接触,所以这里不详说,重点说的是两个串模式匹配算法 1.BF算法 BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符; 若不相等,则比较S的第二个字符和T的第 ...
分类:
其他好文 时间:
2020-05-06 01:20:57
阅读次数:
57