【算法和数据结构】_7_线性结构_字符串_模式匹配
来源:互联网 发布:java物联网框架 编辑:程序博客网 时间:2024/05/09 01:36
发现国内没有好的关于字符串处理的书籍,找了好久没有找到,不知道哪位大侠能介绍一本中文版的,英语的看的速度太慢。
下面是我测试的字符串模式匹配源代码
【Version 1】
这个测试的时候,受北大那个视屏的影响,这个调试了老久没成功。最终虽然也能运行了,但是感觉怪怪的。
/* 本程序测试字符串的各种处理函数和操作*/#include <stdio.h>#include <stdlib.h>#include <string.h>//******************************************************0// 定义用户数据类型typedef long int LINT;typedef enum {FALSE,TRUE} BOOL;//******************************************************1//******************************************************0LINT StringMatch(char* String,char* subString,LINT StartIndex);LINT StringMatchRecall(char* String,char* subString,LINT StartIndex);BOOL SubStringMatchHead(char* String,char* subString);int GetMaxSubStringLen(const char* string);LINT StringMatchKMP(const char* String,char* subString,LINT StartIndex);int main(int argc,char* argv[]){ int x; x=StringMatch("abcdefghijabcdabmn","abcdab",0); printf("%d \n",x); x=StringMatchRecall("abcdefghijabcdabmn","mn",0); printf("%d \n",x); /* if(SubStringMatchHead("abcdefg","abc")) printf("%d \n",1); x=GetMaxSubStringLen("abcdefgabc"); printf("%d \n",x); */ getchar(); getchar(); return 0;}//******************************************************1//******************************************************0/*函数功能: 模式匹配朴素算法:双循环函数原型: LINT StringMatch(char* String,char* subString,LINT StartIndex)函数参数: char* String:字符串 char* subString:模式字符串 LINT StartIndex:搜索开始索引返回值: 如果匹配成功,则返回模式字符串在字符串中开始的首地址; 如果匹配失败,则返回-1异常: 无*/LINT StringMatch(char* String,char* subString,LINT StartIndex){ LINT i; int j; LINT LastIndex; int subStrLen; //检查指针有效性和空串 //其实这里也可以不检测 StartIndex>strlen(String)-strlen(subString) if( !String || !subString || !String[0] || !subString\ || StartIndex > strlen(String)-strlen(subString)\ ) return -1; LastIndex=strlen(String)-strlen(subString); subStrLen=strlen(subString); for(i=StartIndex;i<=LastIndex;i++) { for(j=0;j<subStrLen;j++) { if(String[i+j] - subString[j]) break; } if(j==subStrLen) //这么判断因为要结束循环正好相等 return ++i; //这个地方不能用i++ } return -1;}//******************************************************1//******************************************************0/*函数功能: 模式匹配朴素算法:单循环回溯函数原型: LINT StringMatchRecall(char* String,char* subString,LINT StartIndex)函数参数: char* String:字符串 char* subString:模式字符串 LINT StartIndex:搜索开始索引返回值: 如果匹配成功,则返回模式字符串在字符串中开始的首地址; 如果匹配失败,则返回-1异常: 无*/LINT StringMatchRecall(char* String,char* subString,LINT StartIndex){ LINT i; LINT LastIndex; int j; int SubStrLen; int StringLen; //检查指针有效性和空串 //其实这里也可以不检测 StartIndex>strlen(String)-strlen(subString) if( !String || !subString || !String[0] || !subString\ || StartIndex>strlen(String)-strlen(subString)\ ) return -1; i=StartIndex; j=0; SubStrLen=strlen(subString); StringLen=strlen(String); LastIndex=strlen(String) - SubStrLen ; while( i<=StringLen && j<=SubStrLen) { if(String[i] == subString[j] ) { if(j==SubStrLen-1) return i-j+1; ++i; ++j; } else { i=i-j+1; //回溯 j=0; } } return -1;}//******************************************************1
下面是后来调试的源代码,经过测试能得到正确的结果。
/* 本程序测试字符串的各种处理函数和操作*/#include <stdio.h>#include <stdlib.h>#include <string.h>//******************************************************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);BOOL StrMatch(char* string,char* subStr,int len);//BOOL GetStrNextJ(char* string,int* nextJ);int main(int argc,char* argv[]){ int x; int i; int arrayNum[100]={0}; x=StringMatch("abcdefghijklmn","lm",0); printf("%d \n",x); x=StringMatchRecall("abcdefghijklmn","x",0); printf("%d \n",x); if(StrMatch("abcdefg","bc",strlen("bc"))) printf("Match"); else printf("Not match"); putchar(13); 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/*函数功能: 判断字符串String和subStr是否相等; 相当于strcmp函数, 但是这个函数需要传递3个参数函数原型: BOOL StrMatch(char* string,char* subStr,int len)函数参数: char* string:字符串1 char* subStr:字符串2,字符串string的子串 int len:字符串2的长度返回值: 如果匹配成功则返回TRUE,否则返回FALSE;异常: 无*/BOOL StrMatch(char* string,char* subStr,int len){ int i; if(!string || !subStr || strlen(string)<=len) return FALSE; i=0; while(i<len) { if(string[i] != subStr[i]) return FALSE; //比较过程中,如果出现不匹配现象就返回 i++; //如果相等就继续比较 } return TRUE;}//******************************************************1
这里原本要调试KMP算法的,但是调试了很久都没有成功,主要是自己还没有完全理解KMP算法的思路,只能等到以后慢慢替换了。
看来园子里部分大侠的代码和分析,还是不甚理解KMP算法。
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 【算法和数据结构】_7_线性结构_字符串_模式匹配
- 【算法和数据结构】_6_线性结构_双链表
- 【算法和数据结构】_5_线性结构_单链表
- 【算法和数据结构】_4_线性结构_队列
- 【算法和数据结构】_3_线性结构_栈
- 数据结构与算法_字符串匹配
- 数据结构_线性结构_线性表
- 【算法和数据结构】_9_线性结构_队列_续_1
- 字符串_模式匹配算法(求子串)
- 数据结构与算法(线性表_链式存储结构)
- 数据结构与算法(线性表_链式存储结构)
- 09-数据结构_线性结构-离散存储-链表_插删伪算法
- 数据结构_线性结构_栈与队列
- 数据结构_线性结构_栈与队列
- 数据结构_串_串的模式匹配_KMP算法_C++实现
- 数据结构.字符串.模式匹配算法
- 数据结构_串_串的模式匹配_KMP/BF
- 数据结构与算法(线性表_顺序表存储结构)
- GoF23种设计模式之行为型模式之解释器模式
- 什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
- 题目1045:百鸡问题
- 死锁的原因和必要条件
- C++编译器如何实现异常处理
- 【算法和数据结构】_7_线性结构_字符串_模式匹配
- 南京邀请赛f
- 黑马程序员-Java高新技术-反射
- JavaScript base64编(解)码函数
- 归并排序
- C语言面向对象编程
- 滑屏自动播放效果实现步骤
- Qt QLabel::setBuddy函数
- win7激活工具和pdf解密工具