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 为目标串 通俗讲 ...
随机推荐
- webdriver 操作 Firefox 在关闭浏览器时弹出 “Plugin Container for Firefox已停止工作” 处理办法。
上来先来一个图: 在使用webdriver操作Firefox浏览器的时候,一路顺畅.可是在最后关闭浏览器后,出现了如上面图示的警告!这个警告很早就出现了,因为也不影响测试结果,也就一直没理. 后来新搭 ...
- HDOJ/HDU 1087 Super Jumping! Jumping! Jumping!(经典DP~)
Problem Description Nowadays, a kind of chess game called "Super Jumping! Jumping! Jumping!&quo ...
- 转 wordpress搭建
新建一个博客文件 在搭建博客的过程中,我们需要创建一个文件,用来存储博客的相关信息.这些信息包括域名的信息,主机空间服务器ip,FTP登录名和密码,空间面板登录信息等等,只要是与该博客有关的信息,全部 ...
- 几个shell自动化脚本(定期清理、磁盘空间、搜寻关键字)
发布时间:2014-10-28 09:52:17 编辑:AHLinux.com 分享几个精致耐用的shell脚本,分别用于定期清理暂存文件.检查硬盘空间使用率.搜寻所有记录文件的关键字符串.有需要 ...
- Android 完美退出 App (Exit)
最近两天为了解决Android上面退出程序问题折腾了半死,在google & baidu 上面找了很久.很久出来的完全千篇一律,说的方法有三,但是经过我试验后全部不行. 三个方法分别是: ki ...
- Flume NG中的Netcat Source
NetCat是一个非常简单的Unix工具,可以读.写TCP或UDP网络连接(network connection)中数据 在Flume中的netcat支持Flume与NetCat整合,flume可以使 ...
- Getting started with new I/O (NIO)--reference
The new input/output (NIO) library, introduced with JDK 1.4, provides high-speed, block-oriented I/O ...
- PureMVC(JS版)源码解析(八):Proxy类
前面,我们讲了与视图相关联的Mediator类,接下来我们讲讲与数据相关联的Proxy类. 关于Proxy类的作用,在Proxy类源码中,有这么一段注释: * In PureMVC, Proxy c ...
- 让iOS开发变得更有效率-分类、工具类
在工作中整理的一些分类与工具类,分享给大家.这些工具类可以减少项目中的代码量,让代码变得更简洁,可以大大的提升项目的效率,直接拖到项目中使用即可.下载地址:https://github.com/lee ...
- 设计模式——单例模式 (C++实现)
单例模式也称为单件模式.单子模式,可能是使用最广泛的设计模式.其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享.有很多地方需要这样的功能模块,如系统的日志输出,G ...