
串-朴素匹配算法
发布日期:2021-05-04 06:25:15
浏览次数:20
分类:技术文章
本文共 1317 字,大约阅读时间需要 4 分钟。
不匹配时两次指针回退:
i退回到上次匹配首位的下一位
j退回到子串T的首位
C语言极简版
#include#include #include /* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */int Index(char S[], char T[], int pos) { int i = pos; int j = 0; /* j用于子串中当前位置下标值 */ while (i <= 7 && j <= 1) /* 若i小于S的长度8并且j小于T的长度2时,循环继续 */ { if (S[i] == T[j]) /* 两字母相等则继续 */ { ++i; ++j; } else /* 指针后退重新开始匹配 */ { i = i-j+1; /* i退回到上次匹配首位的下一位 */ j = 0; /* j退回到子串T的首位 */ } } if (j > 1) //j超出模式串的长度 return i-2;//2为模式串的长度 else return 0;} int main(){ printf("请输入主串\n");char zhu[100];scanf("%s",&zhu);//scanf("%s",zhu);在vs2010中能编译通过getchar();printf("请输入模式串\n");char model[100];scanf("%s",&model);getchar();int jieguo=Index(zhu,model,0);printf("请输入模式串+%d\n",jieguo);return 0;}
优化版:在字符串的首位填入字符串的长度
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */int Index(String S, String T, int pos) { int i = pos; int j = 1; /* j用于子串中当前位置下标值 */ while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */ { if (S[i] == T[j]) /* 两字母相等则继续 */ { ++i; ++j; } else /* 指针后退重新开始匹配 */ { i = i-j+2; /* i退回到上次匹配首位的下一位 */ j = 1; /* j退回到子串T的首位 */ } } if (j > T[0]) return i-T[0]; else return 0;}
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月14日 01时45分47秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
VTK:隐式函数之ImplicitSphere
2019-03-03
VTK:InfoVis之DelimitedTextReader
2019-03-03
CCF 201912-1 报数 满分代码
2019-03-03
CCF 201912-2 回收站选址 满分代码
2019-03-03
基于DFA算法实现文章敏感词过滤
2019-03-03
Git commit代码后撤销方法
2019-03-03
数据结构与算法学习1-----稀疏数组
2019-03-03
java手动实现JWT(我和别人的不一样)
2019-03-03
LetCode刷题记录--No3-无重复字符的最长子串
2019-03-03
Java转换xml格式时间 (yyyy-MM-ddTHH:mm:ss.SSSZ)
2019-03-03
Python 使用 __getstate__ 和 __setstate__ 魔法方法
2019-03-03
ts从入门到进阶—4.2类
2019-03-03
hook钩子介绍
2019-03-03
关于json
2019-03-03
字符串详解
2019-03-03
焦点事件
2019-03-03
webpack打包常见报错
2019-03-03
微信小程序--08数据与列表渲染
2019-03-03
微信小程序--11事件
2019-03-03
vuex—1vuex初始
2019-03-03