1. 1、本文档共102页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章串.ppt

串的匹配算法 假设: 当主串第i字符与模式中的第j字符不匹配时 第i字符应与模式中的第k字符进行下一步比较 令 next[j]=k 表示当第j字符与第i字符不匹配时,应该从模式中的第k字符开始再次比较 next[1]= 0 next[2]= 1 next[3]=? … next[j]=? … a b a b c a b c a c b a b a b c a c i=7 j=5 a b a b c a b c a c b a b a b c a c i=7 第k字符 k=2 j=5 得到结论: 第k字符前的k-1个字符与第j字符前的k-1个字符相等 a b a b a b a b a b b c a a b a b b c a c c 另一个模式匹配的例子 主串中的第i个字符与模式中的第j个字符不相等时,将模式串向右滑动,使得第i字符与模式中的第k字符进行下一次比较。 a b a b a b a b a b b c a a b a b b c a c c 另一个模式匹配的例子 主串中的第i个字符与模式中的第j个字符不相等时,将模式串向右滑动,使得第i字符与模式中的第k字符进行下一次比较。 此时为什么k值取为3? a a b a b a b a b a b b c a a b a b b c a c c 另一个模式匹配的例子 主串中的第i个字符与模式中的第j个字符不相等时,将模式串向右滑动,使得第i字符与模式中的第k字符进行下一次比较。 此时为什么k值取为3? a a a b a b a b a b a b b c a a b a b b c a c c 另一个模式匹配的例子 主串中的第i个字符与模式中的第j个字符不相等时,将模式串向右滑动,使得第i字符与模式中的第k字符进行下一次比较。 此时为什么k值取为3? a a a b a b a b a b a b b c a a b a b b c a c c a b a b a b a b a b b c a a b a b b c a c c 第k字符前的k-1个字符与第j字符前的k-1个字符相等 j k i 令next[j]=k 表示第j个字符与第i个字符不相等时使第i字符与第k字符进行下一次比较 第k字符前的k-1个字符与第j字符前的k-1个字符相等 若第k个字符与第j个字符相等,则next[j+1]值为k+1 …………… ………………… k-1 j k j+1 k k k-1 next[j+1] = next[j]+1 推导出:next[j+1] =?? next[j]=k 表示当第j字符与第i字符不匹配时应该从模式中的第k字符开始与第i字符再次比较, next[j+1]如何计算? 模式 第k字符前的k-1个字符与第j字符前的k-1个字符相等 若第k个字符与第j个字符不相等, …………… ……………… k’ j k next[j+1] = k’+1 k’ k’+1 若不存在k’,则 next[j+1] =1 k+1 j+1 a b a a b c a c 1 2 3 4 5 6 7 8 Next[j] 0 1 1 2 2 3 1 2 规定Next[1] = 0 表示模式中第1个字符与主串第i字符不相等时,无需j值回退,直接比较i+1字符即可 当不存在 第j字符前的k-1个字符与 1到k-1 的字符序列相等时 表示j需要回退至模式的第一个字符 next[j]=k 表示当第j字符与第i字符不匹配时应该从模式中的第k字符开始与第i字符再次比较 typedef struct { char *ch; int length; } HString; HString S; 10 B C D E F G H A I J S S.ch = (char *) malloc (10 * sizeof(char) ) S.Length = 10; 串的连接操作: 假设有串S1和串S2连接成串T 5 B C D E A F G H I J S1 5 S1 T B C D E A F G H I J 10 特别注意:若T原来有内存则须先释放原有内存 Status Concat(HString T, HString S1, HString S2) { if ( T.ch ) free(T.ch); T.ch = (char*) malloc((S1.length+S2.length)*sizeof(char)); T.ch[0..S1.length-1] = S1.ch

文档评论(0)

guan_son + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档