【算法与数据结构】字符串模式匹配
数据结构清华大学出版社,4.3节
基本思想:主串S, 模式串T, 求模式串在主串中某一个pos位置开始查找,返回其出现的位置。用i 和 j分别指示指向当前主串S和模式串T元素的下标,从0开始。
首先将主串S的pos位置元素和模式串0位置元素开始比较,如果相等则 i 和 j 都加1,否则i回溯,j回到0。i回溯到的值为i - j + 1,课本上是i - j + 2,因为课本用的下标是从1开始,而我们这里是从0开始。 直到i 或 j 超过了主串S 或 模式串T的最后一个元素位置。
代码如下:
1 // StringMatch.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include <iostream>
6 using namespace std;
7
8 //strMain为主串
9 //strMatch为模式串
10 //返回模式串在pos位置开始查找的出现位置
11 //pos最小为0,最大为主串长度 - 模式串长度
12 //eg. strMain == "hello"
13 //strMatch == "ll", 则pos最大为5 - 2 == 3
14 int StringMatch(const TCHAR* strMain, const TCHAR* strMatch, size_t pos)
15 {
16 size_t nMain = _tcslen(strMain);
17 size_t nMatch = _tcslen(strMatch);
18
19 if (NULL == strMain || NULL == strMatch //输入为空
20 || pos > (nMain - 1) //起始位置超过主串最后一个位置
21 || pos > (nMain - nMatch) //起始位置超过一个合理的位置
22 || nMatch > nMain //模式串长度大于主串
23 )
24 {
25 return -1;
26 }
27
28 size_t i = pos; //主串的比较的起始位置
29 size_t j = 0; //模式串比较的起始位置
30
31 int index = -1; //返回的位置;
32
33 while ( i < nMain && j < nMatch )
34 {
35 if (strMain[i] == strMatch[j])
36 {
37 ++i; ++j;
38 }
39 //回溯
40 else
41 {
42 j = 0;
43 i = i - j + 1;
44 }
45 }
46
47 if (j >= nMatch)
48 {
49 index = i - nMatch;
50 }
51 else
52 {
53 index = -1;
54 }
55
56 return index;
57
58 }
59
60
61 int _tmain(int argc, _TCHAR* argv[])
62 {
63 const TCHAR* lpMain = _T("helloworld");
64 const TCHAR* lpMatch = _T("oworl");
65 size_t pos = 3;
66
67
68 wcout<<"模式串"<<lpMatch<<"在主串"<<lpMain<<"中"<<pos<<"位置开始查找,出现的位置是"<<StringMatch(lpMain, lpMatch, pos)<<endl;
69
70 return 0;
71 }
运行结果如下:
**********************技术交流请 email:cuihao0532#163.com 欢迎转载,转载请注明出处!***************************** 如果对本文满意请扫描文章左侧【二维码添加微信】获取更多好玩、有趣、有益、有营养的料,
你我共同成长!Y(^_^)Y
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗