KMP算法_读书笔记
下面是KMP算法的实现伪代码:
KMP_MATCHER ( T, P )
. n = T.length
. m = P.length
. next = COMPUTE_PREFIX_FUNCTION ( P )
. q = //number of characters matched
. for i = to n //scan the text from left to right
. while q > and P [q+] <> T[i]
//next character does not match
. q = next[q]
. if P[q+ ] == T [i] // next character matches
. q = q+
. if q == m // is all the characters in P matched
. finish
. q = next[q] // look for the next matcher COMPUTE_PREFIX_FUNCTION ( P )
m = P.length
let next be a new array with length of m
next[] =
k =
for q = to m
while k> and P[k+] <> P[q]
k = next [k]
if P[k+] == P[q]
k = k+
next[q] = k
return next
在不同的情况下,对应的next下标是不相同的,当然和个人编写代码的习惯也是有很大的关系,
下面的代码是实现 对 子串 进行 next 的初始化的代码,
在实现中,next 和 子串 的下标 是从 0开始计算的。
#include <stdio.h>
#include <string.h> int main ( )
{
int len ;
char S[] ;
int next[] ; int k , i ; memset( S , , sizeof(S) ) ;
memset (next , , sizeof (next) ) ; scanf("%s" , S) ; len = strlen(S) ; next[] = ; k = ; for ( i = ; i < len ; i++ )
{
while ( k > && S[k] != S [i] )
{
k = next[k] ;
}
if ( S[k] == S[i] )
{
k = k+ ;
} next[i] = k ;
} for ( i = ; i < len ; i++ )
{
printf("next[%d] : %d\n", i,next[i]) ;
} return ;
}
而下面的代码实现的是, 基于KMP 算法的 对字符串的匹配 代码。
LZ 并没有将 next 数组初始化操作写成一个 单独的函数,而是将它作为 整个main 函数中的一个处理步骤。
#include <stdio.h>
#include <string.h> int main ()
{
int len_s , len_t ;
char S[], T[] ;
int next[] ; int k, i ; scanf("%s %s", S , T) ; len_s = strlen(S) ;
len_t = strlen(T) ; memset(next, , sizeof(next) ) ; //initial next array next[] = ; for (k = , i = ; i < len_s ; i++ )
{
while ( k > && S[k] != S[i] )
k = next[k] ;
if ( S[k] == S[i] )
k = k+ ;
next[i] = k ;
} //show next
for ( i = ; i < len_s ; i++ )
{
printf(" next %d \n", next[i]);
} //Main match for (k= , i = ; i < len_t ; i++ )
{
while ( k > && S[k] != T [i] )
k = next[k] ;
if ( S[k] == T[i] )
k = k+ ; if ( k == len_s- )
{
printf("YES\n") ;
break ;
}
} if (i >= len_t )
printf("NO\n") ;
return ;
}
-------------------------ACM_KMP-----------------------------------
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 26253 | Accepted: 10650 |
Description
Given two strings s and t, you have to decide whether s is a
subsequence of t, i.e. if you can remove characters from t such that the
concatenation of the remaining characters is s.
Input
input contains several testcases. Each is specified by two strings s, t
of alphanumeric ASCII characters separated by whitespace.The length of s
and t will no more than 100000.
Output
Sample Input
sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter
Sample Output
Yes
No
Yes
No
----------------------------IDEA-------------------------------------
可以创建两层循环:
循环1{
接收两个字符串 于 S , T 并调用 strlen 计算出 字符串的长度 s:len_s t:len_t
counter = 0 ;
for ( i = 0 ; i < len_t ; i++ )
{
if ( S[counter] == T[i] )
{
if ( counter == len_s -1 )//is S finished?
{
break ;
}
counter++ ;
}
}
if ( counter == len_s-1 ) {printf YES break}
if ( counter != len_s-1 ) {printf NO break }
}
------------------------------SRC-------------------------------------
#include <stdio.h>
#include <string.h> int main()
{
char S[],T[] ;
int s, t;
int counter ,i; while ( ~scanf("%s %s", S,T) )
{
s = strlen ( S ) ;
t = strlen ( T ) ;
counter = ; for ( i = ; i < t ; i++ )
{
if ( T[i] == S[counter] )
{
if (counter == (s-))
{ break ;
} counter++ ;
}
} printf("%d t %d" , i, t) ; if ( counter == s - ) printf("Yes\n") ;
else printf("No\n") ; } return ;
}
//(╰_╯)# 为毛不过呢!!
KMP算法_读书笔记的更多相关文章
- 串的应用与kmp算法讲解--学习笔记
串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...
- 数据结构与算法JavaScript 读书笔记
由于自己在对数组操作这块比较薄弱,然后经高人指点,需要好好的攻读一下这本书籍,原本想这个书名就比较高深,这下不好玩了.不过看着看着突然觉得讲的东西都比较基础.不过很多东西,平时还是没有注意到,故写出读 ...
- 程序语言的奥妙:算法解读 ——读书笔记
算法(Algorithm) 是利用计算机解决问题的处理步骤. 算法是古老的智慧.如<孙子兵法>,是打胜仗的算法. 算法是古老智慧的结晶,是程序的范本. 学习算法才能编写出高质量的程序. 懂 ...
- <算法图解>读书笔记:第4章 快速排序
第4章 快速排序 4.1 分而治之 "分而治之"( Divide and conquer)方法(又称"分治术") ,是有效算法设计中普遍采用的一种技术. 所谓& ...
- <算法图解>读书笔记:第2章 选择排序
第2章 选择排序 2.1 内存的工作原理 需要将数据存储到内存时,请求计算机提供存储空间,计算机会给一个存储地址.需要存储多项数据时,有两种基本方式-数组和链表 2.2 数组和链表 2.2.1 链表 ...
- <算法图解>读书笔记:第1章 算法简介
阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...
- 《java数据结构和算法》读书笔记
大学时并不是读计算机专业的, 之前并没有看过数据结构和算法,这是我第一次看. 从数据结构方面来说: 数组:最简单,遍历.查找很快:但是大小固定,不利于扩展 ...
- <算法图解>读书笔记:第3章 递归
第3章 递归 3.1 递归 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一 ...
- KMP算法_模板_C++
这个博客讲得非常优秀,可惜它是Java版本的 http://blog.csdn.net/yutianzuijin/article/details/11954939/ a 为匹配串,b 为目标串 通俗讲 ...
随机推荐
- nodemon
使用nodemon让node自动重启 开发环境,修改代码服务器自动重启 npm install -g nodemon nodemon app.js
- ☀【CSS3】背景图片
CSS3全新的背景图片方案http://www.cnblogs.com/rubylouvre/p/3401125.html
- HDU-1391 Number Steps
http://acm.hdu.edu.cn/showproblem.php?pid=1391 Number Steps Time Limit: 2000/1000 MS (Java/Others) ...
- tcp/ip体系-转载
如果还想在测试这条路上继续走下去的话,那么下面这些东西就是我们必须去掌握的,至少你还不想止步于简单的黑盒测试--其实,一直想去接触Linux下的应用测试,这样能学到东西会很多,而且会非常的受用.之前听 ...
- Java---replace与replaceAll的区别
乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样. 这两者很容易搞混,在这里详细讲述下. ...
- 格式化URL
//格式化url查询参数为json function formatUrl(url){ var reg=/(?:[?&]+)([^&]+)=([^&]+)/g; var data ...
- phpeclipse xdebug 配置配置 -摘自网络
一.安装配置 1.访问 http://www.phpeclipse.com/ ,找到右边的 1.2.x dev nightly下的http://update.phpeclipse.com/update ...
- 2 weekend110的mapreduce介绍及wordcount + wordcount的编写和提交集群运行 + mr程序的本地运行模式
把我们的简单运算逻辑,很方便地扩展到海量数据的场景下,分布式运算. Map作一些,数据的局部处理和打散工作. Reduce作一些,数据的汇总工作. 这是之前的,weekend110的hdfs输入流之源 ...
- [一位菜鸟的COCOS-2D编程之路]COCOS2D中得动作,特效和动画
一,CCActionManager 管理所有节点动作的对象 来看看打飞机里面的一个onEnter 方法 - (void)onEnter { [super onEnter]; //一定要注意添加此方法, ...
- 遮罩层的实现(纯js兼容版)
这个代码是我以前测试时候的代码了,主要用到的知识点是opacity和filer分别实现 “标准浏览器”和IE浏览器下的半透明,使用js的document.body.offsetwidth 和scree ...