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

数据结构昨天重新学习了一下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. win7系统下python安装numpy,matplotlib,scipy和scikit-learn

    1.安装numpy,matplotlib,scipy和scikit-learn win7系统下直接采用pip或者下载源文件进行安装numpy,matplotlib,scipy时会遇到各种问题,这是因为 ...

  2. 【Android自学日记】两种适配器的使用

    ArrayAdapter适配器: (1)用于显示基本的文字内容 (2)基本使用过程:新建适配器---创建或加载数据源---适配器加载数据源---视图加载适配器 ArrayAdapter(上下文,当前L ...

  3. ubuntu

    mongoChef: http://3t.io/mongochef/download/core/platform/#tab-id-3 背景色改成豆沙绿: /usr/share/themes/Ambia ...

  4. 自己常用的webstrom快捷键

    1.ctrl+"d" 复制正行 2.ctrl+"y" 删除正行 3.ctrl+"-" 缩小整块 4.ctrl+"+" 扩 ...

  5. MacBook安装双系统(Windows多分区)

    分区 ---------- 启动电脑,放入mac os安装盘,按alt选择光盘启动. 1. 在工具菜单里选择磁盘工具对整个硬盘进行分区: ----------- 第一个是  exFAT.Msdos 格 ...

  6. NIO及Reactor模式

    关于Nio Java NIO即Java Non-blocking IO(Java非阻塞I/O),是Jdk1.4之后增加的一套操作I/O工具包,又被叫做Java New IO. Nio要去解决的问题 N ...

  7. c/c++ string

    string类的定义.操作. #include<iostream> #include<string> using namespace std; int main() { // ...

  8. LeetCode 64 Minimum Path Sum

    Problem: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom ri ...

  9. vim /vi中对字符串的查找并替换

    vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询.    :s/vivian/sky/ 替换当前行第一个 vivian ...

  10. 【JavaScript】--ajax

    1 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传 ...