字符串的匹配
来源:互联网 发布:匡恩网络 孙一桉 编辑:程序博客网 时间:2024/06/05 23:50
字符串的匹配指的是一个字符串的全部元素是另一个字符串的一部分,也就是说子串是主串的一部分。数据结构与算法中的字符串模式匹配问题一般都描述如下:如果子串SubString在主串MainString中存在,则返回存在的位置,如果不存在,则返回-1。该函数的接口为:int StringMatch(char[] mainString, char[] subString, ref int currentPos)。下面我先写出两个简单的算法:
代码1:
int StringMatch(char[] mainString, char[] subString){if(mainString.Length < subString.Length) return -1;int currentPos=0;while(currentPos + subString.Length-1 < mainString.Length) //currentPos的最大位置,再大的话它从currentPos到结尾的子串位数小于子串{for(int i=0; i<subString.Length; i++){if(mainString[currentPos+i] != subString[i]) break;}if(i==subString.Length) return currentPos;currentPos++;}return -1;}代码2:
int StringMatch(char[] mainString, char[] subString, ref int currentPos){int j=0;while( currentPos<mainString.Length && j<subString.Length){if(mainString[currentPos+j] == subString[j]){if(j==subString.Length-1) return currentPos;currentPos++;j++;}else{currentPos = currentPos-j+1; //不相等,通过子串当前位置相对于初始位置 找到之前主串的currentPos,然后再+1是当前位置的下一个位置}}//字符串完全匹配,则在while循环内返回正确的位置。所以此时返回的是不能匹配的标志。return -1;}
虽然第二段代码少了一个循环,但是他们两个的算法复杂度是相同的。都是讲currentPos不断迭代+1,直到找到匹配点或找不到返回-1;但是第二段代码可以更好地扩展为KMP模式匹配算法。当在一次匹配过程中,j为相对于子串初始位置的偏移,当此次匹配过程中 subString[j]不匹配,则下一次匹配不用将currentPos变为currentPos+1,而是直接可以跨越好几个字符变为next[j],省去了很多迭代。这里KMP模式匹配就不具体列出来了,它的关键其实就是推导出next[j]这个数组,当此次匹配中子串第j个位置的字符和主串不匹配,则next[j]指的是currentPos的下一个位置。
通过这个算法,我获得的知识是:同一种算法思想可以有很多中实现方式,但是一个支持扩展的实现方式是一个难能可贵的算法实现。找到可以改进的地方,然后改进,是编程不断发展的基石。
0 0
- 字符串匹配的算法
- 字符串的模式匹配
- 字符串的模式匹配
- 字符串的匹配 -KMP
- 字符串的匹配过程
- 字符串的模式匹配
- 字符串的模式匹配
- bzoj1461字符串的匹配
- kmp字符串的匹配
- 字符串的匹配
- 字符串的匹配
- 分隔字符串的匹配
- 字符串的模式匹配
- 字符串的匹配--朴素
- 字符串的快速匹配
- 字符串的模式匹配
- 字符串匹配的总结
- 字符串的匹配
- 图的邻接表存储 c实现
- Spring JDBCtemplate.batchupdate 批量跟新数据 实例
- 一次完整的Http请求过程
- 树莓派与Arduino串口通信
- Xamarin Android百度地图之Fragment做tab页加载百度地图
- 字符串的匹配
- 内存溢出
- 压力测试工具ab 及 centos下单独安装方法
- 毕达哥拉斯三元组及本原毕达哥拉斯三元组
- 09-3. Hashing - Hard Version
- 加盟科迪诺中美杂交一号土元紧握开启财富大门的钥匙
- synchronized块和synchronized方法的区别
- 为什么V8引擎这么快?
- HDU--2502月之数【水题】【规律】