第3章串.pptVIP

  • 4
  • 0
  • 约7.8千字
  • 约 36页
  • 2016-08-21 发布于重庆
  • 举报
第3章串

int Index-again(char S[ ], char T[ ]){ succ=0; for(i=1;(i=S[0]-T[0]+1 succ==0);++i){ j=1; while(j0 j=T[0]) j=(S[i+j-1]==T[j])?j+1:0; if(jT[0]) succ=i; } return succ; } S=‘s1…si-j+1…si-k+1… si-1 si …sn’ 前面定义的next函数在某些情况下尚有缺陷.例如: S=“aaaab”, T=“aaabaaaab”,当i=4,j=4时,next[j]还需要进行i=4,j=3; i=4,j=2; i=4,j=1三次比较。所以我们可以对计算next的算法作如下修正,而匹配算法IndexKMP不变。 void GetNext(char T[ ], int next[ ]) { next[1]=0; j=1; k=0; while (jT[0]) if ((k==0)| |(T[j]= =T[k])) { j++; k++; if(T[j]!=T[k]) next[j]=k; else next[j]=next[k]; } else k=next[k]; } 第3章 特殊线性表——串 在串S和串T中分别设比较的起始下标i和j; 2. 循环直到S中所剩字符长度小于T的长度或T中所有字符均比较完毕 2.1 如果S[i]=T[j],继续比较S和T的下一个字符;否则 2.2 将j向右滑动到next[j]位置,即j=next[j]; 2.3 如果j=0,则将i和j分别加1,准备下一趟比较; 3. 如果T中所有字符均比较完毕,则返回匹配的起始下标;否则返回0; KMP算法用伪代码描述 int IndexKMP(char S[ ], char T[ ]){ i= j=1; while(i=S[0]-T[0]+1 j=T[0]) if(j==0||S[i]= =T[j]) //继续比较后续字符 {j=j+1;i=i+1;} else j=next[j]; //模式串向右移动 if(jT[0]) return i-T[0]+1; //匹配成功 else return 0; } //IndexKMP * 第3章 特殊线性表——串 3.3.1 串的逻辑结构 1. 串的定义 串是零个或多个字符组成的有限序列 。 空格串:只包含空格的串。 串的长度 :串中所包含的字符个数。 空串:长度为0的串。 空串记作 “ ”; 非空串通常记作:S=“s1 s2 …… sn” 其中:S是串名;双引号是定界符 ;双引号引起来的部分是串值 。si(1≤i≤n)是一个任意字符。 第3章 特殊线性表——串 子串:串中任意个连续的字符组成的子序列。 主串:包含子串的串 。 子串在主串中的位置:子串的第一个字符在主串中的序号 。 S1=ab12cd S2=“ab12 S3= S4=φφφ “ 串的长度? 第3章 特殊线性表——串 3. 串的比较 串的比较是通过组成串的字符之间的比较来进行的。 给定两个串: X=x1x2…xn Y=y1y2…ym 则当n=m且x1=y1,…,xn=ym时,称X=Y; 当下列条件之一成立时,称X<Y: ⑴ n<m,且xi=yi(i=1,2,…,n); ⑵ 存在某个k≤min(m,n),使得xi=yi(i=1,2,…,k-1),xk<yk。 2. 串的抽象数据类型定义 串的基本操作通常以“串的整体”作为操作对象。 第3章 特殊线性表——串 ⑴ StrLength (s):求串s的长度。 ⑵ StrAssign (s1,s2):串赋值,将s2的串值赋值给串s1。 ⑶ StrConcat (s1,s2,s):串的连接,将串s2放在串s1的后面连接成一个新串s。 ⑷ SubStr (s,i,len):求子串,返回从串s的第i个字符开始取长为 len 的子串。 第3章 特殊线性表——串 ⑸ StrCmp (s1,s2):串比较,若s1=s

文档评论(0)

1亿VIP精品文档

相关文档