串匹配

简介:

 

复制代码
  1 /*******************************************************************************
  2 /* <PRE>
  3 /* 版权所有    : -
  4 /* 模块名      : 串
  5 /* 文件名      : string.cpp
  6 /* 功能描述    : 串的模式匹配
  7 /* 作者        : <xxx>
  8 /* 版本        : 1.0
  9 /* -----------------------------------------------------------------------------
 10 /* 备注        : -
 11 /* -----------------------------------------------------------------------------
 12 /* 修改记录    :
 13 /* 日 期        版本     修改人        修改内容
 14 /* 2011/01/01   1.0      <xxx>         创建
 15 /* </PRE>
 16 *******************************************************************************/
 17 #include <stdio.h>
 18 #include <stdlib.h>
 19 #include <string>
 20 
 21 /******************************************************************************
 22 /* 数据结构声明
 23 /******************************************************************************/
 24 /* 串的定长顺序存储表示 */
 25 #define MAXSTRLEN 255   /* 用户可以在255以内定义最大串长 */
 26 typedef unsigned char SString[MAXSTRLEN + 1];  /* 0号单元存放串的长度 */
 27 
 28 /******************************************************************************
 29 /* 函数原型声明
 30 /******************************************************************************/
 31 void get_next(SString T, int next[]);
 32 void get_nextval(SString T, int nextval[]);
 33 
 34 /*******************************************************************************
 35 /* <FUNC>
 36 /* 函数名   : Index
 37 /* 功能     : 求子串位置
 38 /* 参数     : -
 39 /* 返回值   : -
 40 /* 备注     : 返回子串T在主串S中第pos个字符之后的位置。若不存在, 则函数值为0
 41 /*            其中, T非空, 1 <= pos <= StrLength(S)
 42 /* 作者     : <xxx>
 43 /* </FUNC>
 44 *******************************************************************************/
 45 int Index(SString S, SString T, int pos) {
 46     int i = pos; int j = 1;
 47     while (i <= S[0] && j <= T[0]) {
 48         if (S[i] == T[j]) {++i;  ++j;} //继续比较后继字符
 49         else {i = i - j + 2;  j = 1;}  //指针后退重新开始匹配
 50     }
 51     if (j > T[0]) return i - T[0];
 52     else return 0;
 53 }
 54 
 55 /*******************************************************************************
 56 /* <FUNC>
 57 /* 函数名   : Index_KMP_1
 58 /* 功能     : 求子串位置的KMP算法1
 59 /* 参数     : -
 60 /* 返回值   : -
 61 /* 备注     : 利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法
 62 /*            其中, T非空, 1 <= pos <= StrLength(S)
 63 /* 作者     : <xxx>
 64 /* </FUNC>
 65 *******************************************************************************/
 66 int Index_KMP_1(SString S, SString T, int pos) {
 67     int i = pos; int j = 1;
 68     int *next = (int *)malloc((T[0] + 1) * sizeof(int));
 69     get_next(T, next);
 70     while (i <= S[0] && j <= T[0]) {
 71         if (j == 0 || S[i] == T[j]) {++i;  ++j;} //继续比较后继字符
 72         else j = next[j];                        //模式串向右移动
 73     }
 74     free(next);
 75     if (j > T[0]) return i - T[0];               //匹配成功
 76     else return 0;
 77 }
 78 
 79 /*******************************************************************************
 80 /* <FUNC>
 81 /* 函数名   : get_next
 82 /* 功能     : 求next函数值
 83 /* 参数     : -
 84 /* 返回值   : -
 85 /* 备注     : 求模式串T的next函数值, 并存入数组next
 86 /* 作者     : <xxx>
 87 /* </FUNC>
 88 *******************************************************************************/
 89 void get_next(SString T, int next[]) {
 90     int i = 1, j = 0;    next[1] = 0;
 91     while (i < T[0]) {
 92         if (j == 0 || T[i] == T[j]) {++i;  ++j; next[i] = j;}
 93         else j = next[j];
 94     }
 95 }
 96 
 97 /*******************************************************************************
 98 /* <FUNC>
 99 /* 函数名   : Index_KMP_2
100 /* 功能     : 求子串位置的KMP算法2
101 /* 参数     : -
102 /* 返回值   : -
103 /* 备注     : 利用模式串T的nextval函数求T在主串S中第pos个字符之后的位置的KMP算法
104 /*            其中, T非空, 1 <= pos <= StrLength(S)
105 /* 作者     : <xxx>
106 /* </FUNC>
107 *******************************************************************************/
108 int Index_KMP_2(SString S, SString T, int pos) {
109     int i = pos; int j = 1;
110     int *nextval = (int *)malloc((T[0] + 1) * sizeof(int));
111     get_nextval(T, nextval);
112     while (i <= S[0] && j <= T[0]) {
113         if (j == 0 || S[i] == T[j]) {++i;  ++j;}    //继续比较后继字符
114         else j = nextval[j];                        //模式串向右移动
115     }
116     free(nextval);
117     if (j > T[0]) return i - T[0];                  //匹配成功
118     else return 0;
119 }
120 
121 /*******************************************************************************
122 /* <FUNC>
123 /* 函数名   : get_nextval
124 /* 功能     : 求nextval函数值
125 /* 参数     : -
126 /* 返回值   : -
127 /* 备注     : 求模式串T的next函数值修正值并存入数组nextval
128 /* 作者     : <xxx>
129 /* </FUNC>
130 *******************************************************************************/
131 void get_nextval(SString T, int nextval[]) {
132     int i = 1;   nextval[1] = 0;  int j = 0;    
133     while (i < T[0]) {
134         if (j == 0 || T[i] == T[j]) {
135             ++i;  ++j; 
136             if (T[i] != T[j]) nextval[i] = j;
137             else nextval[i] = nextval[j];
138         }
139         else j = nextval[j];
140     }
141 }
142 
143 /*******************************************************************************
144 /* <FUNC>
145 /* 函数名   : main
146 /* 功能     : 测试函数
147 /* 参数     : -
148 /* 返回值   : -
149 /* 备注     : -
150 /* 作者     : <xxx>
151 /* </FUNC>
152 *******************************************************************************/
153 void main()
154 {
155     SString S, T;
156     S[0] = strlen("ababcabcacbab");
157     T[0] = strlen("abcac");
158     strcpy((char *)&S[1], "ababcabcacbab");
159     strcpy((char *)&T[1], "abcac");
160 
161     printf("Index: %d\n", Index(S, T, 1));
162     printf("Index_KMP_1: %d\n", Index_KMP_1(S, T, 1));
163     printf("Index_KMP_2: %d\n", Index_KMP_2(S, T, 1));
164 }
复制代码

来源:http://www.cnblogs.com/JCSU/articles/1298329.html





本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3292419.html,如需转载请自行联系原作者

目录
相关文章
|
5天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
307 116
|
20天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
504 45
Meta SAM3开源:让图像分割,听懂你的话
|
14天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
695 222
|
2天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
137 95
|
12天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1711 158
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
953 62