博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法和数据结构】_8_线性结构_字符串_模式匹配_续_1
阅读量:7050 次
发布时间:2019-06-28

本文共 4661 字,大约阅读时间需要 15 分钟。

  其实,模式匹配的穷举法也可以改进,下面是经过改进后的代码。

【Improve Version】

  其中StrMatchImp()函数是经过改进后的函数。

/*    本程序测试字符串的各种处理函数和操作*/#include 
#include
#include
//******************************************************0// 定义用户数据类型typedef long int LINT;typedef enum {FALSE,TRUE} BOOL;//******************************************************1//******************************************************0int StringMatch(char* String,char* subString,int StartIndex);int StringMatchRecall(char* String,char* subString,int StartIndex);int StrMatchImp(char* string,char* subString,int startIndex);int main(int argc,char* argv[]){ int x; x=StringMatch("abcdefghijklmn","lm",0); printf("%d \n",x); x=StringMatchRecall("abcdefghijklmn","x",0); printf("%d \n",x); x=StrMatchImp("abcdefghijklmn","lm",0); printf("%d \n",x); getchar(); getchar(); return 0;}//******************************************************1//******************************************************0/*函数功能: 模式匹配朴素算法:双循环函数原型: int StringMatch(char* String,char* subString,int StartIndex)函数参数: char* String:字符串 char* subString:模式字符串 int StartIndex:搜索开始索引返回值: 如果匹配成功,则返回模式字符串在字符串中开始的首地址; 如果匹配失败,则返回-1异常: 无*/int StringMatch(char* String,char* subString,int StartIndex){ int i, j; int StrLen, SubStrLen; StrLen=strlen(String); SubStrLen=strlen(subString); //检查指针有效性和空串 //其实这里也可以不检测 StartIndex>strlen(String)-strlen(subString) if( !String || !subString || !String[0] || !subString\ || StartIndex > StrLen-SubStrLen\ ) return -1; for(i=StartIndex;i<= StrLen - SubStrLen ;i++) { for(j=0; j < SubStrLen ;j++) { if(String[i+j] - subString[j]) break; } if(j==SubStrLen) //这么判断因为要结束循环正好相等 return ++i; //这个地方不能用i++ } return -1;}//******************************************************1//******************************************************0/*函数功能: 模式匹配朴素算法:单循环回溯函数原型: int StringMatchRecall(char* String,char* subString,LINT StartIndex)函数参数: char* String:字符串 char* subString:模式字符串 int StartIndex:搜索开始索引返回值: 如果匹配成功,则返回模式字符串在字符串中开始的首地址; 如果匹配失败,则返回-1异常: 无*/int StringMatchRecall(char* String,char* subString,int StartIndex){ int i, j; int StrLen, SubStrLen; StrLen=strlen(String); SubStrLen=strlen(subString); //检查指针有效性和空串 //其实这里也可以不检测 StartIndex>strlen(String)-strlen(subString) if( !String || !subString || !String[0] || !subString\ || StartIndex > StrLen-SubStrLen\ ) return -1; i=StartIndex; j=0; while( i < StrLen ) { if(String[i] == subString[j] ) { ++j; ++i; } else { i=i-j+1; //回溯 j=0; } if(j==SubStrLen) return i-j+1; } return -1;}//******************************************************1//******************************************************0/*函数功能: 字符串模式匹配穷举法:改进版函数原型: int StrMatchImp(char* string,char* subString,int startIndex)函数参数: char* string: 字符串 char* subString:模式字符串 int startIndex:搜索首索引返回值: 如果匹配成功,返回匹配首字符的index+1异常: 无*/int StrMatchImp(char* string,char* subString,int startIndex){ int i, j; int StrLen, SubStrLen; StrLen=strlen(string); SubStrLen=strlen(subString); //检查指针有效性和空串 //其实这里也可以不检测 StartIndex>strlen(String)-strlen(subString) if( !string || !subString || !string[0] || !subString\ || startIndex > StrLen-SubStrLen\ ) return -1; for(i=startIndex;i<= StrLen - SubStrLen ;i++) { for(j=0; j < SubStrLen ;j++) { if( string[i+j] - subString[j]) break; else { //如果模式的首字符subString[0]已经匹配, //则判断最后一个字符subString[SubStrLen-1]是否匹配 //依次类推,这样最好的时候可以提高效率, //最差的时候还是需要O(m*n) if(string[i+SubStrLen-1-j] - subString[SubStrLen-1-j]) break; } } if(j==SubStrLen) //这么判断因为要结束循环正好相等,也可用subString[j]=='\0' return ++i; //这个地方不能用i++ } return -1;}//******************************************************1//******************************************************0/*函数功能: 求解字符串本身的从尾节点往头节点方向子串中最大的匹配串函数原型: int GetMaxSubStringLen(const char* string)函数参数: const char* String:字符串返回值: 如果有的话则返回最大长度,否则就返回-1异常: 无*/int GetMaxSubStringLen(const char* string){ return -1;}//******************************************************1

  程序运行结果如下所示:

  

  这个东西还是有很复杂啊,哎,需要继续学习学习。

转载地址:http://emsol.baihongyu.com/

你可能感兴趣的文章
Python: The _imagingft C module is not installed错误的解决
查看>>
HTTP请求报文和HTTP响应报文
查看>>
第3课 - 初识程序的灵魂
查看>>
WordPress插件扫描工具plecost
查看>>
【PDF】Java操作PDF之iText超入门
查看>>
PHP:第五章——字符串过滤函数
查看>>
Spring中ApplicationContextAware的用法
查看>>
flask的session解读及flask_login登录过程研究
查看>>
ElasticSearch单机多实例环境部署
查看>>
python 练习
查看>>
Centos 安装 nload
查看>>
python3简单使用requests
查看>>
由一次java作业 引起的思考
查看>>
HDU 3389 Game(博弈)
查看>>
仅IE支持clearAttributes/mergeAttributes方法
查看>>
Linux中U盘和SD卡加载卸载命令
查看>>
github push403错误的处理
查看>>
Hibernate与 MyBatis的比较
查看>>
关于百度地图API的地图坐标转换问题
查看>>
【操作系统】设备管理(五)
查看>>