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

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

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define LEN 100
  4. void getNext(int *next, char *pattern)
  5. {
  6. int len = strlen(pattern);
  7. next[] = -;
  8. int i = , j = -;
  9. while(i < len)
  10. {
  11. if(pattern[i] == pattern[j] || j == -)
  12. {
  13. ++i, ++j;
  14. next[i] = j;
  15. if(patter[i] == pattern[j])
  16. next[i] = next[j];
  17. }
  18. else
  19. j = next[j];
  20. }
  21. }
  22.  
  23. int KMP(char *str, char *pattern, int *next)
  24. {
  25. getNext(next, pattern);
  26. int len1 = strlen(str), len2 = strlen(pattern);
  27. int i = , j = ;
  28. while(i < len1 && j < len2)
  29. {
  30. if(str[i] == pattern[j] || j == -)
  31. {
  32. i++, j++;
  33. }else{
  34. j = next[j];
  35. }
  36. }
  37. if(j == len2)
  38. return i-j;
  39. return -;
  40. }
  41. int main()
  42. {
  43. int next[LEN];
  44. char str[LEN], pattern[LEN];
  45. int n, index;
  46. scanf("%d", &n);
  47. while(n--)
  48. {
  49. scanf("%s%s", str,pattern);
  50. index = KMP(str, pattern, next);
  51. printf("%d\n", index);
  52. }
  53. return ;
  54. }
  55.  
  56. /*
  57. 测试用例
  58. 3
  59. abcabcbababcaba
  60. ababcaba
  61. abcabcbababcaba
  62. ababcaba
  63. abcabcbababcaba
  64. ababcaba
  65.  
  66. */

2017年12月11日08:54:05

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

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

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

详细请看

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

  1. class Solution(object):
  2. def BF_Match(self, haystack, needle):
  3. hlen = len(haystack)
  4. nlen = len(needle)
  5.  
  6. if hlen >= nlen:
  7. for k in xrange(hlen - nlen + 1):
  8. i = k
  9. j = 0
  10. while i < hlen and j < nlen and haystack[i] == needle[j]:
  11. i += 1
  12. j += 1
  13. if j == nlen:
  14. return k
  15. else:
  16. continue
  17. return -1
  18.  
  19. def pmt(self, needle):
  20. """
  21. PartialMatchTable
  22. :param needle:
  23. """
  24. nlen = len(needle)
  25. prefix = [needle[:i+1] for i in xrange(len(needle)-1)]
  26. print prefix
  27. postfix = [needle[i+1:] for i in xrange(len(needle)-1)]
  28. print postfix
  29.  
  30. intersection = list(set(prefix) & set(postfix))
  31. maxlen = 0
  32. for i in xrange(0,len(intersection)):
  33. if maxlen < len(intersection[i]):
  34. maxlen = len(intersection[i])
  35. if intersection:
  36. #print intersection,maxlen
  37. return maxlen
  38. return 0
  39.  
  40. def kmp(self, haystack, needle):
  41. i = 0
  42. hlen = len(haystack)
  43. nlen = len(needle)
  44. while i < hlen-nlen+1:
  45. match = True
  46. for j in xrange(nlen):
  47. if haystack[i+j] != needle[j]:
  48. match = False
  49. break
  50. if match:
  51. return i
  52. if j:
  53. i += j - self.pmt(needle[:j])
  54. else:
  55. i += 1
  56. return -1
  57.  
  58. def strStr(self, haystack, needle):
  59. """
  60. :type haystack: str
  61. :type needle: str
  62. :rtype: int
  63. """
  64. if len(haystack) >= 0 and len(needle) == 0:
  65. return 0
  66.  
  67. if len(haystack) < len(needle):
  68. return -1
  69.  
  70. for i in xrange(0, len(haystack)):
  71. tmpi = i
  72. cnt = 0
  73. for j in xrange(0, len(needle)):
  74. if(tmpi < len(haystack)) and haystack[tmpi] == needle[j]:
  75. tmpi += 1
  76. j += 1
  77. cnt += 1
  78. if len(needle) == cnt:
  79. return i
  80.  
  81. return -1
  82.  
  83. haystack = "aabaaabaaac"
  84.  
  85. #haystack = "ababcaababcaabc"
  86.  
  87. needle ="aabaaac"
  88.  
  89. s = Solution()
  90. 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. plsql配置数据库连接

    工具/原料   PL/SQL 方法/步骤     在Oracle的安装文件下查找tnsnames.ora文件,一般路径如: ORACLE_HOME%\network\admin下: 如果真的找不到路径 ...

  2. bzoj4314

    首先,我们考虑原题取消k的限制后怎么做. 设(xy)是一个n次单位根,f(x)=(1+x^0)*(1+x^1)*(1+x^2)*...*(1+x^n-1) 参见 http://bx2k.is-prog ...

  3. Ubuntu上Grafana 监控 Docker的技巧

    导读 Grafana 是一个有着丰富指标的开源控制面板.在可视化大规模测量数据的时候是非常有用的.根据不同的指标数据,它提供了一个强大.优雅的来创建.分享和浏览数据的方式. 它提供了丰富多样.灵活的图 ...

  4. ubuntu15:10 163源

    sudo vim /etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ wily main restricted universe mult ...

  5. selenium page object & Page Factory

    package demo; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa ...

  6. Python之mmap内存映射模块(大文本处理)说明

    背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...

  7. ABAP 出库单打印 产品 A搭A A搭B显示方式

    *&---------------------------------------------------------------------* *& Report   *& ...

  8. 最小生成树(prim&kruskal)

    最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法:                  原始的加权连通图——————D被选作起点,选与之相连的权值 ...

  9. APM的飞行模式

    1.稳定模式Stabilize 稳定模式是使用得最多的飞行模式,也是最基本的飞行模式,起飞和降落都应该使用此模式. 此模式下,飞控会让飞行器保持稳定,是初学者进行一般飞行的首选,也是FPV第一视角飞行 ...

  10. WPF 如何绘制不规则按钮,并且有效点击范围也是不规则的

    最近在做一个东西,如地图,点击地图上的某一区域,这一区域需要填充成其他颜色.区域是不规则的,而且点击该区域的任一点,都能够变色.普通的按钮只是简单的加载一幅图肯定是不行的.查了很多资料,终于把它搞定了 ...