- 12
- 0
- 约2.76千字
- 约 26页
- 2016-07-27 发布于浙江
- 举报
字符串匹配
字符串匹配;给定一个长度不超过n的长字符串A和若干个长度不超过m的短字符串B1…Bm
对于每个短字符串,找出它在长字符串中出现的所有位置。
例:ababcababcabc ababc
则返回0,5;枚举全部n个起始位置,依次进行字符串匹配。
时间复杂度:O(nm)
每次字符串匹配没有利用前一次的结果
如何利用字符串B的一个已匹配前缀来减少比较次数?;;假设当前匹配以第i位为起始位置,0~k位匹配成功,k+1位匹配失败。
则以第i+j位为起始位置,0~k-j位可以匹配成功的条件是字符串B的0~k-j位和j~k位相同。
若j=1时不满足,则可以跳过以接下来1位为起始位置的匹配,以此类推。;定义next[]数组,对于字符串B长度为i的前缀,next[i]取值为:小于i,且令其长度为next[i]的前缀和后缀为相同字符串的最大值。
例:ababc
i 1 2 3 4 5
next[i] 0 0 1 2 0
若从第i位开始,前3位(aba)匹配成功,第4位匹配失败,则无需从第i+1位开始,因为前2位的ba必然无法匹配ab,而从第i+2位开始,前1位的a可以匹配a。;使用:当前匹配位数为k而出现匹配失败时,将当前匹配位数直接改为next[k],继续在A的相同位置匹配,若仍匹配失败就继续改为next[next[k]]…
生成:
若B串第i位和第next[i]位相同,则next[i+1]=ne
原创力文档

文档评论(0)