终于学完串这个章节,这就利用两篇文章来谈一谈学习的心得!
串的应用是比较贴近生活的,最常用的例子就是用搜索引擎的时候,我们输入一个字符,它就会帮我们做了模式匹配的工作,如图:
功能如此强大,还贴近生活,还解决了各种单身汉的问题,所以串这种数据结构一定要掌握清楚!
首先是,阐述一下串的几个概念:
1、串:(string)是由零个或多个字符组成的有限序列,又名字符串;
2、串的长度:串中的字符数目n称为串的长度;
3、空串:零个字符的串称为空串;
4、空格串:只包含空格的串。(注意与空串的区别)可以是很多空格;
5、子串:串中任意个数的连续字符组成的子序列,重要概念,本算法的重点概念。
算法简介:brute force有道翻译是野蛮暴力,书上的翻译叫朴素的模式匹配! 反差巨大啊,不过这两个名字都很形象的说明了这个算法的精要。
简单的说,就是对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配,对主串做大循环,同时对子串进行进行小循环,直到匹配成功或者全部遍历完成为止!
代码:
首先把我的串的定义写出来,按个人方式写,我的是模仿书上的方式,为了匹配后面的KMP算法而设计的串:
typedef struct{ /*串的定义*/
char str[255];
int size;
}SString;
void StrAssign(SString * T, char *a) /*串是从为序1开始的,0位放置数组的大小*/
{
int n=strlen(a);
memset(T->str,0,255);
T->str[0]=n;
strcat(T->str,a);
T->size=n;
}
void StrShow(SString * T) /*利用StrShow正确显示*/
{
for (int i=1;i<=T->size;i++)
{
cout<<T->str[i];
}
cout<<endl;
}
然后是算法的主要部分:我会好好的做注释
int indext_BF(SString * S,SString * T,int pos)
{ /*返回T串在S串中第pos个字符以后的位置,若不存在返回0*/
int i=pos; /*主串的位置下标*/
int j=1; /*子串的当前位置下标*/
while (i<=S->str[0] && j<=T->str[0]) /*若i小于S的长度,且j小于T的长度时循环*/
{
if (j==0 || S->str[i]==T->str[j]) /*两字母相等则继续*/
{
i++;
j++;
}
else
{
i=i-j+2;j++; //主串和子串进行回溯操作
}
}
if(j>T->str[0]) //判断是否匹配,当j大于子串的长度时说明匹配成功了
{
return i-T->str[0];
}
else
{
return 0;
}
}
输出结果为:
由于暴力匹配的思路和代码是比较简单的,这里就不多做解释,明天我会将KMP算法发布出来!