最近忙着考研复习,所以刷题少了。。

数据结构昨天重新学习了一下KMP算法,今天自己试着写了写,问题还不少,不过KMP算法总归是理解了,以前看v_JULY_v的博客,一头雾水,现在终于懂了他为什么要在算完next[]之后,所有值都减一了。。。。。。

为了顺便复习下C语言,就没有用C++写,而且写出来比较丑。。

 #include <stdio.h>
#include <string.h>
#define LEN 100
void getNext(int *next, char *pattern)
{
int len = strlen(pattern);
next[] = -;
int i = , j = -;
while(i < len)
{
if(pattern[i] == pattern[j] || j == -)
{
++i, ++j;
next[i] = j;
if(patter[i] == pattern[j])
next[i] = next[j];
}
else
j = next[j];
}
} int KMP(char *str, char *pattern, int *next)
{
getNext(next, pattern);
int len1 = strlen(str), len2 = strlen(pattern);
int i = , j = ;
while(i < len1 && j < len2)
{
if(str[i] == pattern[j] || j == -)
{
i++, j++;
}else{
j = next[j];
}
}
if(j == len2)
return i-j;
return -;
}
int main()
{
int next[LEN];
char str[LEN], pattern[LEN];
int n, index;
scanf("%d", &n);
while(n--)
{
scanf("%s%s", str,pattern);
index = KMP(str, pattern, next);
printf("%d\n", index);
}
return ;
} /*
测试用例
3
abcabcbababcaba
ababcaba
abcabcbababcaba
ababcaba
abcabcbababcaba
ababcaba */

2017年12月11日08:54:05

今天再来看字符串匹配的时候,KMP又忘记了,现在知道的是:

  对于短字符串来说,匹配的时候,会计算它的部分匹配表(即,前缀和后缀相同时,串的最大长度)

  当匹配时,需要用 已经移动了的长度 -  部分匹配长度

详细请看

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

class Solution(object):
def BF_Match(self, haystack, needle):
hlen = len(haystack)
nlen = len(needle) if hlen >= nlen:
for k in xrange(hlen - nlen + 1):
i = k
j = 0
while i < hlen and j < nlen and haystack[i] == needle[j]:
i += 1
j += 1
if j == nlen:
return k
else:
continue
return -1 def pmt(self, needle):
"""
PartialMatchTable
:param needle:
"""
nlen = len(needle)
prefix = [needle[:i+1] for i in xrange(len(needle)-1)]
print prefix
postfix = [needle[i+1:] for i in xrange(len(needle)-1)]
print postfix intersection = list(set(prefix) & set(postfix))
maxlen = 0
for i in xrange(0,len(intersection)):
if maxlen < len(intersection[i]):
maxlen = len(intersection[i])
if intersection:
#print intersection,maxlen
return maxlen
return 0 def kmp(self, haystack, needle):
i = 0
hlen = len(haystack)
nlen = len(needle)
while i < hlen-nlen+1:
match = True
for j in xrange(nlen):
if haystack[i+j] != needle[j]:
match = False
break
if match:
return i
if j:
i += j - self.pmt(needle[:j])
else:
i += 1
return -1 def strStr(self, haystack, needle):
"""
:type haystack: str
:type needle: str
:rtype: int
"""
if len(haystack) >= 0 and len(needle) == 0:
return 0 if len(haystack) < len(needle):
return -1 for i in xrange(0, len(haystack)):
tmpi = i
cnt = 0
for j in xrange(0, len(needle)):
if(tmpi < len(haystack)) and haystack[tmpi] == needle[j]:
tmpi += 1
j += 1
cnt += 1
if len(needle) == cnt:
return i return -1 haystack = "aabaaabaaac" #haystack = "ababcaababcaabc" needle ="aabaaac" s = Solution()
print s.kmp(haystack, needle)

  

POJ3461 KMP 模板题的更多相关文章

  1. HDU 1711 - Number Sequence - [KMP模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  2. POJ Oulipo KMP 模板题

    http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4 ...

  3. POJ Oulipo(KMP模板题)

    题意:找出模板在文本串中出现的次数 思路:KMP模板题 #include<cstdio> #include<cstring> #include<cmath> #in ...

  4. (模板)poj3461(kmp模板题)

    题目链接:https://vjudge.net/problem/POJ-3461 题意:给出主串和模式串,求出模式串在主串中出现的次数. 思路:kmp板子题. AC代码: #include<cs ...

  5. Number Sequence - HDU 1711(KMP模板题)

    题意:给你一个a串和一个b串,问b串是否是a串的子串,如果是返回b在a中最早出现的位置,否则输出-1   分析:应该是最简单的模板题了吧..... 代码如下: ==================== ...

  6. hdu 1711 Number Sequence(KMP模板题)

    我的第一道KMP. 把两个数列分别当成KMP算法中的模式串和目标串,这道题就变成了一个KMP算法模板题. #include<stdio.h> #include<string.h> ...

  7. HDU 1711Number Sequence【KMP模板题】

    <题目链接> 题目大意: 意思是给出两个串,找出匹配串在模式串中的位置. 解题分析: KMP算法模板题. #include <cstdio> #include <cstr ...

  8. POJ:3461-Oulipo(KMP模板题)

    原题传送:http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS Memory Limit: 65536K Description The F ...

  9. poj3461 Oulipo (KMP模板题~) 前面哪些也是模板题 O.O

    # include <stdio.h> # include <algorithm> # include <string.h> using namespace std ...

随机推荐

  1. 让VS2010支持Windows2000

      2015-10-20 14:21 375人阅读 评论(0) 收藏 举报  分类: 学习笔记(33)  技术心得(1)  用Visual Studio 2010编译的程序无法在Windows 200 ...

  2. JS心得——判断一个对象是否为空

    判断一个对象是否为空对象,本文给出三种判断方法: 最常见的思路,for...in...遍历属性,为真则为"非空数组":否则为"空数组" 2.通过JSON自带的. ...

  3. Android Notification通知详解

    根据activity的生命周期,在activity不显示时,会执行onStop函数(比如按下home键),所以你在onStop函数(按退出键除外)里面把notification放在通知栏里,再此显示时 ...

  4. python dict clear只能删除一层,不能够递归删除。

    void PyDict_Clear(PyObject *op) { dictobject *mp; dictentry *ep, *table; int table_is_malloced; Py_s ...

  5. leetcode一些常用函数

    6移位操作 “>> 右移,高位补符号位” 这里右移一位表示除2“>>> 无符号右移,高位补0”: 与>>类似“<< 左移” 左移一位表示乘2,二位 ...

  6. JAVA基础学习——1.3 关于JAVA环境变量设定 Path,Java_Home,ClassPath

    在安装完JDK以后,要设定JAVA环境变量. 刚接触的时候,我很困惑,这特么什么玩意啊,然后知其然不知其所以然的 按照说明做完了却不知道为什么这么做,这里简单做一些总结说明. 首先,什么是环境变量 环 ...

  7. WebService -- Java 实现之 CXF ( 添加系统预定义的拦截器)

    1. 概述 CXF允许我们在webservice的in/out位置添加拦截器.拦截器有两大分类,一类是系统预定义的:另一类是自定义拦截器. 2. 在server端添加拦截器. JaxWsServerF ...

  8. [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...

  9. dubbo升级spring4与cxf

    阿里的dubbo项目是基于spring2.x的.但之后停止更新了.当当网有根据dubbo扩展成dubbox,基于spring3.x,但我的项目中用的是spring4.x,于是fork了dubbox,自 ...

  10. Python实现简单的Web完整版(一)

    在拖了一周之后,今天终于在一个小时之内将一个迷你的Web写出来了,最近改其它项目的bug头好大,但是好喜欢这样的状态. 黑色的12月,所有的任务都聚集在了12月,然后期末考试也顾不上好好复习了,但是但 ...