字符串的匹配

来源:互联网 发布:匡恩网络 孙一桉 编辑:程序博客网 时间: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刘兰芳 岳飞传 刘兰芳白眉大侠 刘兰芳 薛刚反唐 评书杨家将刘兰芳播讲全集 刘兰芳评书大全在线听 刘兰芳评书呼家将93回 呼家将评书刘兰芳全集 刘兰芳评书网赵匡胤 呼家将刘兰芳评书全集 刘兰芳评书赵匡胤演义 刘兰芳评书网在线收听 刘兰芳赵匡胤演义100回 刘兰芳评书在线收听 刘兰芳评书赵匡胤演义100 刘兰芳岳飞传全集mp3在线听 刘兰芳评书大全岳飞传 评书赵匡胤刘兰芳播讲 扬家将评书刘兰芳播讲 岳飞传刘兰芳全集117 刘兰芳评书杨家将93回在线听 评书岳飞传刘兰芳播讲117回 刘兰芳评书赵匡胤演义100回 刘兰芳评书杨家将全集 刘兰芳评书杨家将全传 刘兰芳评书岳飞全传 刘兰芳评书岳飞传大全117集 刘兰芳评书网赵匡胤演义 刘兰芳平书杨家将全集 刘兰芳评书呼家将全集 评书杨家将刘兰芳广播全集 评书网刘兰芳岳飞传 评书杨家将刘兰芳mp3下载 评书岳飞传刘兰芳全集 刘兰芳岳飞传全集mp3下载 评书网刘兰芳杨家将 刘兰芳的评书岳飞传 刘兰芳评书大全呼家将 刘兰芳评书打包下载 杨家将评书刘兰芳全集下载 评书呼家将刘兰芳 全集 刘兰芳评书下载mp3打包下载