串学习笔记

一、概念:串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模式算法:(克努拉-莫里斯-普拉特算法)

原文地址:https://www.cnblogs.com/zhou2011/p/2938643.html