一、概念:串string是由零个或多个字符组成的有限序列,又名字符串。
1、有限,指长度是一个有限的数值。零个字符的串称为空串NULL string,它的长度为0。
2、序列,说明串的相邻字符之间具有前驱和后继关系。
空格串:只包含空格的串。空格串是有内容有长度的,要与空串区别开。
子串和主串:串中任意个数的连续字符组成的子序列称为该串的子串;相应的,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。
二、串的比较
1、在C语言中比较两个串是否相等,必须是它们串的长度以及它们各个对应位置的字符都相等时,才算是相等。
例如:要查找主串str中"abcdabcef",找到ttr子串"abcef"的位置。思路:从主串str第一位开始,str和ttr前3个字符都是匹配的,但是str主串中第4个字符d与子串ttr中的第4个字符e不匹配,所以就重新匹配。从主串str的第2个字符开始,发现,str中的第二个字符与子串中的第一个字符a不匹配,所以重新匹配。从str中第3个字符开始,与ttr第一个字符开始匹配。。。。(简单的说:就是对主串的每一个字符作为子串开头,与要匹配的字符串进行匹配,对主串做大循环,每个字符开头做ttr长度的小循环,直到匹配成功或全部遍历结束。)
在比较的过程中,如果两串中字符相等,则继续往后匹配判断,如果不相等,记录主串当前位置的值必须退回到上次匹配首位的下一位,而记录子串当前位置的值退回到子串的首位。
1 int Index(char *str, char *ttr, int pos) 2 { 3 int nStr, nTtr, sCnt, tCnt; 4 nStr = strlen(str); 5 nTtr = strlen(ttr); 6 sCnt = tCnt = 0; 7 8 while (sCnt <= nStr && tCnt <= nTtr) 9 { 10 if (str[sCnt] == ttr[tCnt]) 11 { 12 ++sCnt; 13 ++tCnt; 14 } 15 else 16 { 17 sCnt = sCnt - tCnt + 1; 18 tCnt = 0; 19 } 20 } 21 if (tCnt > nTtr) 22 return sCnt - nTtr; 23 else 24 return 0; 25 }
上面的方法是普通的模式匹配算法,但是这种算法有时效率不高,存在大量的重复遍历情况。
KMP模式算法:(克努拉-莫里斯-普拉特算法)