设:m是模式串pattern的长度,n是主串长度
传统的字符串匹配(暴力法)的时间复杂度是O(n*m)。
而KMP串匹配算法可以将时间复杂度降为O(n+m),这需要一个额外的预处理O(m)。
KMP优化的地方在于:当出现字符失配的情况时,无需回溯i指针,而是利用已经匹配的部分,将模式串尽可能向右滑动一部分。
实际上:KMP的预处理本身就是一个模式串pattern“自我匹配”的过程。因此,预处理和kmp算法主体非常神似。
预处理过程:
int get_next(ch[......]
设:m是模式串pattern的长度,n是主串长度
传统的字符串匹配(暴力法)的时间复杂度是O(n*m)。
而KMP串匹配算法可以将时间复杂度降为O(n+m),这需要一个额外的预处理O(m)。
KMP优化的地方在于:当出现字符失配的情况时,无需回溯i指针,而是利用已经匹配的部分,将模式串尽可能向右滑动一部分。
实际上:KMP的预处理本身就是一个模式串pattern“自我匹配”的过程。因此,预处理和kmp算法主体非常神似。
预处理过程:
int get_next(ch[......]
字符串(string)是由零个或者多个字符串组成的有限序列。
字符串中字符的数目称为字符串的长度。
串中任意个连续字符组成的子序列称为改串的子串。包含子串的串相应地称为主串。
串相等:当且仅当两个串的长度相等,并且各个对应位置的字符都相等时。
由一个或者多个空格组成的串' '称为空格串,非空字符串!
C语言中的字符串最末尾是'\0',这个不用解释了。
串赋值StrAssign、串比较StrCompare、串求长StrLength、串连接StrConcat以及[......]
队列也可以用顺序存储表示。定义还是一样的:从队尾rear推入元素。从头部head拿出元素,是FIFO。
与链式存储一致,我们仍然需要附设两个指针front和rear分别表示队列头元素和队列元素的位置。初始时front=rear=0是队列空的条件。
每当插入新的队列元素时,尾指针将增1.删除队列头元素时,头指针增加1。即非空队列中:头元素总是指向队首元素,而尾指针总是指向队尾元素的下一个位置。
除了基本的顺序存储外,我们还可以使用循环数组来构造一个循环队列。
在循环队列中,[......]
原题地址:《The Suspecst》
题目大意:某学校有N个学生,M个社团,每个学生可以属于多个社团。SARS流行,但是社团活动频繁,一旦一个社团有一个人是SARS疑似,所有人都是SARS疑似。现在假定第0号学生是SARS疑似,求所有疑似病例。
这个就是典型的并查集问题……我挑了这个最水的问题实践了一下。和刚才哪篇并查集无异。数据弱所以连rank union都不用就能过。
思路是:每个社团读取后直接把他们union起来。最后将学生0的parent和其他N-1个学生比较(来判断[......]
背景:如果我们需要将元素划分到若干不相交的子集中,使用并查集可以快速确定某两个元素是否位于同一个子集。
并查集是一种数据结构,除了Union-Find Set,又叫做Disjoint-Set。更确切的说,它主要包含了两种操作:Find和Union。具体信息可以见维基百科:《Disjoint-set data structure 》
并查集主要包含两个操作:
Find(x):返回元素位于那个划分的子集合内。
Union(x, y):将x, y两个集合中的元素合并为一个集合。[......]