1、Definition

串string,是零个或多个字符组成的有限序列。一般记作S="a1a2a3...an",其中S是串名,双引号括起来的字符序列是串值;ai(1<= i <=n)可以是字母、数字或其他字符;串中所包含的字符个数称为该串的长度。长度为零的串称为空串(Empty String),不包含任何字符。

2、

子串、主串:串中任意连续的字符组成的子序列被称为该串的子串。包含子串的串有被称为该子串的主串。

子串的位置:子串在主串中第一次出现的第一个字符的位置。

两个串相等:两个串长度相等,并且各个对应的字符也都相等。

3、串的模式匹配算法

串的匹配实际上是对与合法的位置1<= i <=n-m+1,依次将目标串中的子串S[i..i+m-2]和模式串T[1..m-1]进行比较,若S[i..i+m-2]=T[1..m-1],则称从位置i开始的匹配成功,亦称模式T在目标S中出现:若S[i..i+m-2]!=T[1..m-1],则称从位置i开始的匹配失败。

其算法段为:

for(i=1; i<=n-m+1; i++)
if(S[i..i+m-2]=T[1..m-1])
return i;

  

int index1(string s, string t)
{
int n=s.length();
int m=t.length(); for(int i=0;i<n-m; i++)
{
int j=0;
int k=i;
while(j<m && s[k]==t[j])
{
k++;
j++;
}
if(j>=m)return i;
} return -1;
}

  

int index2(string s, string t)
{
int n=s.length();
int m=t.length();
int i,j;
while((i<n) && (j<m))
{
if(s[i]==t[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j>=m)return i-j;
else return -1;
}

  

4、KMP算法

在3中我们看到的是模式匹配的暴力求解法,这种算法虽然能够得到结果,但问题是,这个算法的时间复杂度为O(M*N),效率不高,为了解决这个问题,KMP三人对此做出了改进,提出了KMP算法。

详细描述:

在一般的暴力求解法中,当文本串第i个字符与模式串第j个字符不匹配时,文本串往往会回溯到i-j+1处,而模式串会回溯到0处,在KMP算法中却不用进行这样的回溯,

当发生失配时,我们通过拉动模式串进行不回溯的检查,当文本串第i个字符与模式串第j个字符不匹配时,模式串会跳转到next[j]值所在的位置再继续比较(next[j]是啥?莫急,稍后解释),如果next[j]只是-1,那么只能从模式串开始来比较了。

KMPcode

int KMP(string s, string t, int next[])
{
int i=0;
int j=0;
int n=s.length();
int m=t.length(); while((i<n)&&(j<m))
{
if(j=-1||s[i]==t[j])
{
i++;
j++;
}
else
j=next[j];
} if(j==m)return i-j;
else return -1;
}

  现在让我们来看看next是啥子玩意

next是一个数组,是一个模式函数值,对于每一个模式串的每一个字符可能会存在最大k个前缀与k个后缀相等,则字符的next值为k个前缀的下一个字符的index,对于第一个字符来说它的next值就为-1,以下贴出求数组代码

void CalcNext(string s, int next[])
{
int n=s.length();
next[0]=-1;
int k=-1;
int j=0;
while(j<n)
{
if(k==-1||s[j]==s[k])
{
++k;
++j;
next[j]=k;
}
else
k=next[k];
}
}

  以下为优化代码,有的地方可以称次next数组为nextvalue数组

void CalcNext(string p, int next[])
{
int n=p.length();
next[0]=-1;
int k=-1;
int j=0;
while(j<n)
{
if(k==-1||p[j]==p[k])
{
++k;
++j;
if(p[j]==p[k])
next[j]=next[k];
else
next[j]=k;
}
else
{
k=next[k];
}
}
}

  

串string (KMP)的更多相关文章

  1. hdu 3336:Count the string(数据结构,串,KMP算法)

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. HDOJ 2203 亲和串 【KMP】

    HDOJ 2203 亲和串 [KMP] Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  3. [从今天开始修炼数据结构]串、KMP模式匹配算法

    [从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...

  4. hdu 3336 Count the string KMP+DP优化

    Count the string Problem Description It is well known that AekdyCoin is good at string problems as w ...

  5. HDU 2203 亲串(kmp)

    Problem Description 随着人们年龄的增长更大,更聪明还是越大越愚蠢,这是一个值,相同的问题Eddy也一直在思考,由于他在非常小的时候就知道亲和串怎样推断了,可是发现,如今长大了却不知 ...

  6. 第4章学习小结_串(BF&KMP算法)、数组(三元组)

    这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串s ...

  7. 数据结构-模式匹配串算法(KMP)

    #include<cstdio> #include<iostream> #include<string> #include<cstring> #incl ...

  8. Codeforces Round #282 (Div. 1)B. Obsessive String KMP+DP

    B. Obsessive String   Hamed has recently found a string t and suddenly became quite fond of it. He s ...

  9. 串、KMP模式匹配算法

    串是由0个或者多个字符组成的有限序列,又名叫字符串. 串的比较: 串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号. 计算机中常用的ASCII编码,由8位二进制 ...

随机推荐

  1. Time.timeScale、游戏暂停

    原文链接 项目里面一直在用Time.timeScale来做游戏的 1倍 2倍整体加速,今天我仔细看了一下Time.timeScale才发现之前我理解错了一些东西. Time.timeScale可以控制 ...

  2. CreateMutex()参数报错问题

    举例: hMutex = CreateMutex(NULL, FALSE,"screen"); 报错 error C2664:"CreateMutexW": 不 ...

  3. 命令行解决mysql中文乱码

    修改my.ini文件中的 [mysql] default-character-set=gbk [mysqld] # The default character set that will be use ...

  4. 转:NSString什么时候用copy,什么时候用strong

    大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢? 比如: @property (retain,nonatomic) NSString *rStr; @ ...

  5. IOS Android支持中文与本地文件的读取写入

    转自http://www.xuanyusong.com/archives/1069 和http://www.benmutou.com/archives/2094 前几天有个朋友问我为什么在IOS平台中 ...

  6. eclipse 安卓运行一直跳转到调试模式

    最直接的办法,换手机试试,如果在其他手机上能run,那就重启手机即可 感觉写这么一点点似乎不足以发表一篇博客,给个链接吧:http://www.itnose.net/detail/6103213.ht ...

  7. 安卓---Tabhost实现页面局部刷新--父页子页之间的传值

    TabHost的实现分为两种,一个是不继承TabActivity,一个是继承自TabActivity:当然了选用继承自TabActivity的话就相对容易一些,下面来看看分别是怎样来实现的吧. 我只写 ...

  8. [SOJ] shortest path in unweighted graph

    Description 输入一个无向图,指定一个顶点s开始bfs遍历,求出s到图中每个点的最短距离. 如果不存在s到t的路径,则记s到t的距离为-1.   Input 输入的第一行包含两个整数n和m, ...

  9. Openjudge-NOI题库-出书最多

    描述 假定图书馆新进了m(10 ≤ m ≤ 999)本图书,它们都是由n(2 ≤ n ≤ 26)个作者独立或相互合作编著的.假设m本图书编号为整数(1到999),作者的姓名为字母('A'到'Z'),请 ...

  10. springmvc获取jar中的静态资源与jar包中的资源互相引用问题

    1.首先看jar中的文件位置 2.在web工程中引用该jar 并且在springmvc文件中配置路径 如果有多个路径可用逗号隔开 3.在web工程找jsp页面如何引用 这样就可以了 关于jar中的资源 ...