首页 > 编程知识 正文

串匹配并行算法,串的模式匹配算法例题

时间:2023-05-06 09:25:32 阅读:112156 作者:1099

字符串的概念在说明字符串的一般算法之前,请先知道以下字符串。 字符串的定义很简单,字符串是指由零或多个字符组成的有限序列,也称为字符串。

串的存储结构串的存储结构简单地分为两类:顺序存储或链存储。

序贯记忆可以理解为按序列记忆,连锁记忆是按链表记忆。 这两者的特征在前一篇文章中已经说过,所以这里不做说明。

字符串朴素模式匹配算法是日常工作中常见的操作,复制一句话或一个词,在全文检索中出现在文章的哪里? 这种子字符串定位操作通常被称为字符串模式匹配,模式匹配是字符串中最重要的操作之一。

这里举一个大数据结构的例子。

要从主字符串S=“goodgoogle”中找到部分字符串T=“google”的位置,通常需要执行以下步骤:

从主字符串s的第一位开始,s和t的前三个字符一致成功,但s的第四个字符是d,t是g。 第一名匹配失败了。

从主字符串的第二位开始,主字符串的s首字母为o,匹配的t首字母为g,匹配失败。

从主串s第三位开始,主串s的首字母为o,匹配的t首字母为g,匹配失败

从主串s第4位开始,主串s的首字符为d,匹配的t首字符为g,匹配失败

从主字符串s的第5位开始,s与t、6个字符完全匹配,成功匹配

整个流程实际上是将主字符串中的每个字符作为子字符串的开头,与匹配的字符串匹配,然后在主字符串中形成大循环,在每个字符的开头形成t长度小的循环,直到匹配成功或所有路径都完成。

接下来,我们来看看具体的代码实现。 /** *常规模式匹配*/publicclasscommonstring test { publicstaticintindexof (strings,stringt ) char [ ] ss=s.to CCS char [ int sLength=ss.length; int tLength=tt.length; /**1.检查主字符串和子字符串是否为* 2.检查子字符串和主字符串的长度大小* 3. for循环搜索中是否找到完全匹配的子字符串*/if(slength=0) { return t lint sLength : -1; (else ) if ) tlength=0) { return 0; (控制/**for环长,在两者的差上加1。 加1是为了即使两者相等也进行比较。 例如,如果两者的长度之差为3,则使) */int fsize=sLength - tLength 1循环4次。 for(intI=0; i fsize; I () /主字符串和子字符串的第一个位置相同的charif(ss[I]!=TT[0]}{do{I; }while(Ifsizess[I]!=tt[0]; } /** *找到后续遍历即可。 后续遍历是指主串和子串都顺序递增,以匹配*/if(ifsize () /,从而获得下一匹配的位置int next=i 1。 int var 11=下一个长度- 1; /**遍历、其余【目标字符串】、var10未从var12越界时(小于var11表示其余【目标字符串】的范围),同时以【源字符串】==【目标字符串】 var12({next; //匹配源字符串中的目标字符串,匹配结束,索引位置if(next==var11 ) {返回I; } } }返回- 1; } publicstaticvoidmain (string [ ] args ) system.out.println (索引) ) 12345678 ),) 456 ) ); }这种匹配方式,最好的情况是什么? 那就是从一开始就匹配成功。 例如,我用“谷歌谷歌”去找“谷歌”。 时间的复杂性是o(1),例如用“abcdef谷歌”去找“谷歌”。 那么,时间复杂度是o(nm ),其中n是主串长度,m是匹配的部分串长度。

最坏情况下,每次匹配失败时都会发生在主字符串的最后一个字符中。 例如,前者的49个“0”和1个“1”的主字符串,后面9个“0”和1个“1”的子字符串,在匹配时,每次都要在t中使字符循环到最后一位才能发现。 这种最坏情况下的时间复杂度是o(((n-m1 ) ) )。

朴素模式匹配的缺点是,每当匹配不成功时,就追溯到主串的下一个位置进行匹配。 这实际上效率不高。 下一章介绍了KMP算法,感受到好的算法是如何提高时间复杂度的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。