串的模式匹配算法 ------ KMP算法
//KMP串的模式匹配算法
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int* get_next(char t[], int length)
{
int i = , j = -;
int* next = (int *)malloc(length * sizeof(int));
next[] = -;
while (i < length)
{
if (j == - || t[i] == t[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
} return next;
} int Index_KMP(char s[], char t[], int sl, int tl, int next[])
{
int j, i;
j = ;
i = ;
while (j < tl && i < sl)
{
if (j == - || s[i] == t[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j == tl)
{
return i - tl;
}
else
{
return ;
}
} //计算next函数修正值的算法
int *get_nextval(char t[], int length)
{
int i = , j = -;
int* nextval = (int*)malloc(length*sizeof(int));
nextval[] = -;
while (i < length)
{
if (j == - || t[i]==t[j])
{
j++;
i++;
if (t[j]!=t[i])
{
nextval[i] = j;
}
else
{
nextval[i] = nextval[j]; //回溯到下标为nextval[j]但元素与下标为nextval[i]的元素不相同的位置
}
}
else
{
j = nextval[j];
}
} return nextval;
} int main()
{ char s[] = "acabaabaabcacaabc";
char t[] = "abaabcac";
char t2[] = "abcdabd";
int tl = strlen(t);
int sl = strlen(s);
/*int *next = get_next(t, tl);
int c = Index_KMP(s, t, sl, tl, next); //返回开始正确匹配的下标(s的下标)
printf("%d\n", c);*/
int l = strlen(t2);
int * nextval = get_nextval(t,tl);
/*for(int i = 0; i<l;i++)
{
printf("%d ",nextval[i]);
}*/
int c = Index_KMP(s, t, sl, tl, nextval);
printf("%d\n",c); printf("\n");
return ;
}
理解:
模式匹配就是将主串中下标为i的元素与模式串中下标为j的元素进行比较(比较过程中i不会回溯 而j的值会按照next对应的值进行回溯)
串的模式匹配算法 ------ KMP算法的更多相关文章
- 《数据结构》之串的模式匹配算法——KMP算法
//串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...
- 串的模式之kmp算法实践题
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...
- Java数据结构之字符串模式匹配算法---KMP算法2
直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...
- Java数据结构之字符串模式匹配算法---KMP算法
本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基 ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- 【算法】串的模式匹配算法(KMP)
串的模式匹配算法 问题: 求子串位置的定位函数如何写? int index(SString S,SString T,int pos); 给定串S,子串T,问T在 ...
- 串、串的模式匹配算法(子串查找)BF算法、KMP算法
串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...
- 字符串匹配算法——KMP算法
处理字符串的过程中,难免会遇到字符匹配的问题.常用的字符匹配方法 1. 朴素模式匹配算法(Brute-Force算法) 求子串位置的定位函数Index( S, T, pos). 模式匹配:子串的定位操 ...
- 串的应用与kmp算法讲解--学习笔记
串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...
随机推荐
- (转)Is attacking machine learning easier than defending it?
转自:http://www.cleverhans.io/security/privacy/ml/2017/02/15/why-attacking-machine-learning-is-easier- ...
- (转载)c# winform 窗体起始位置 设置
窗体起始位置为顶部中间,WinForm居中显示: ; ; this.StartPosition = FormStartPosition.Manual; //窗体的位置由Location属性决定 thi ...
- SPOJ 694 Distinct Substrings(不相同子串个数)
https://vjudge.net/problem/SPOJ-DISUBSTR 题意: 给定一个字符串,求不相同的子串的个数. 思路: #include<iostream> #inclu ...
- Git、GitHub、GitLab三者之间的联系以及区别
在讲区别以及联系之前先简要的介绍一下,这三者都是什么(本篇文章适合刚入门的新手,大佬请出门左转) 1.什么是 Git? Git 是一个版本控制系统. 版本控制是一种用于记录一个或多个文件内容变化,方便 ...
- Linux下清空或删除大文件内容的2种方法
在Linux终端下处理文件时,有时候我们想要直接清空文件的内容时但又不用使用任何Linux命令行编辑器,去打开这些文件.那如何才能达到这个目的呢? 1.通过重定向到NULL来清空文件内容 清空或者让一 ...
- Java方法中捕获多个异常的处理机制
/** * @author wangyunhan * @throws Exception */ public static void main(String[] argßs) throws Excep ...
- ashx图片上传接收
发送数据流方法 /// <summary> /// PostBinaryData /// </summary> /// <param name="url&quo ...
- 返回Json格式结果
static string ReturnData(int resultCode, string resultMessage = "", string resultData = &q ...
- Winform 设置控件值
private void SetControlValue(Control control, object value) { try { control.FindForm().Invoke((Actio ...
- 用html+css+js实现选项卡切换效果
文章转载自:http://tongling.github.io/JSCards/ 用html+css+js实现选项卡切换效果 使用之前学过的综合知识,实现一个新闻门户网站上的常见选项卡效果: 文字素材 ...