POJ3461 KMP 模板题
最近忙着考研复习,所以刷题少了。。
数据结构昨天重新学习了一下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 模板题的更多相关文章
- HDU 1711 - Number Sequence - [KMP模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- POJ Oulipo KMP 模板题
http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4 ...
- POJ Oulipo(KMP模板题)
题意:找出模板在文本串中出现的次数 思路:KMP模板题 #include<cstdio> #include<cstring> #include<cmath> #in ...
- (模板)poj3461(kmp模板题)
题目链接:https://vjudge.net/problem/POJ-3461 题意:给出主串和模式串,求出模式串在主串中出现的次数. 思路:kmp板子题. AC代码: #include<cs ...
- Number Sequence - HDU 1711(KMP模板题)
题意:给你一个a串和一个b串,问b串是否是a串的子串,如果是返回b在a中最早出现的位置,否则输出-1 分析:应该是最简单的模板题了吧..... 代码如下: ==================== ...
- hdu 1711 Number Sequence(KMP模板题)
我的第一道KMP. 把两个数列分别当成KMP算法中的模式串和目标串,这道题就变成了一个KMP算法模板题. #include<stdio.h> #include<string.h> ...
- HDU 1711Number Sequence【KMP模板题】
<题目链接> 题目大意: 意思是给出两个串,找出匹配串在模式串中的位置. 解题分析: KMP算法模板题. #include <cstdio> #include <cstr ...
- POJ:3461-Oulipo(KMP模板题)
原题传送:http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS Memory Limit: 65536K Description The F ...
- poj3461 Oulipo (KMP模板题~) 前面哪些也是模板题 O.O
# include <stdio.h> # include <algorithm> # include <string.h> using namespace std ...
随机推荐
- plsql配置数据库连接
工具/原料 PL/SQL 方法/步骤 在Oracle的安装文件下查找tnsnames.ora文件,一般路径如: ORACLE_HOME%\network\admin下: 如果真的找不到路径 ...
- bzoj4314
首先,我们考虑原题取消k的限制后怎么做. 设(xy)是一个n次单位根,f(x)=(1+x^0)*(1+x^1)*(1+x^2)*...*(1+x^n-1) 参见 http://bx2k.is-prog ...
- Ubuntu上Grafana 监控 Docker的技巧
导读 Grafana 是一个有着丰富指标的开源控制面板.在可视化大规模测量数据的时候是非常有用的.根据不同的指标数据,它提供了一个强大.优雅的来创建.分享和浏览数据的方式. 它提供了丰富多样.灵活的图 ...
- ubuntu15:10 163源
sudo vim /etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ wily main restricted universe mult ...
- selenium page object & Page Factory
package demo; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa ...
- Python之mmap内存映射模块(大文本处理)说明
背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...
- ABAP 出库单打印 产品 A搭A A搭B显示方式
*&---------------------------------------------------------------------* *& Report *& ...
- 最小生成树(prim&kruskal)
最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法: 原始的加权连通图——————D被选作起点,选与之相连的权值 ...
- APM的飞行模式
1.稳定模式Stabilize 稳定模式是使用得最多的飞行模式,也是最基本的飞行模式,起飞和降落都应该使用此模式. 此模式下,飞控会让飞行器保持稳定,是初学者进行一般飞行的首选,也是FPV第一视角飞行 ...
- WPF 如何绘制不规则按钮,并且有效点击范围也是不规则的
最近在做一个东西,如地图,点击地图上的某一区域,这一区域需要填充成其他颜色.区域是不规则的,而且点击该区域的任一点,都能够变色.普通的按钮只是简单的加载一幅图肯定是不行的.查了很多资料,终于把它搞定了 ...