法一解释:转自http://www.cnblogs.com/yjiyjige/p/3263858.html

关键运算步骤


  1. i 0 1 2 3 4 5 6 7 8 9
  2. A B A C D A B A B C
  3. a -1 0 0 1 0 0 1 2 3 2
  4. s[1]!=s[a=0] -> a=next[a=0]=-1 -> next[++1]=++a=0;
  5. s[2]==s[a=0] -> next[++2]=++a=1;
  6. s[3]!=s[a=1] -> a=next[a=1]=0 -> s[3]!=s[a=0] -> a=-1 ->s[4]=0;
  7. s[8]!=s[a=3] -> a=next[a=3]=1 -> s[8]==s[a=1] -> s[++8]=s[9]=++a=2;
  1. #include<iostream>
  2. #include<string.h>
  3. #include<stdio.h>
  4. #include<algorithm>
  5. using namespace std;
  6. int next1[111111];
  7. char s[]="ABACDABABA";//"ABABCABAA";
  8. void getnext()
  9. {
  10. int i=0,a=-1;//i代表字符的下标,a代表失配时下一步要移动的位置
  11. next1[0]=-1;
  12. while(i<strlen(s))
  13. {
  14. if(a==-1||s[i]==s[a])//
  15. next1[++i]=++a;
  16. else
  17. a=next1[a];
  18. }
  19. for(int k=0;k<i;k++)
  20. {
  21. printf("%d\n",next1[k]);
  22. }
  23. }
  24. int main()
  25. {
  26. getnext();
  27. return 0;
  28. }

法二:运用最大长度表

  1. #include<iostream>
  2. #include<string.h>
  3. #include<stdio.h>
  4. #include<algorithm>
  5. using namespace std;
  6. int next[111111];
  7. void next1(char s[],int next[],int n)
  8. {
  9. next[0]=0;
  10. int len=0,i=1;//len表示前缀长度
  11. while(i<n)
  12. {
  13. if(s[i]==s[len])//第i个等于第len个
  14. {
  15. len++;
  16. next[i]=len;
  17. i++;
  18. }
  19. else
  20. {
  21. if(len>0)
  22. len=next[len-1];
  23. else//也就是len=0的情况
  24. {
  25. next[i]=len;//0
  26. i++;
  27. }
  28. }
  29. }
  30. for(int i=n;i>0;i--)//值右移一位
  31. next[i]=next[i-1];
  32. next[0]=-1;
  33. }
  34. int main()
  35. {
  36. char s[]="ABABCABAA";
  37. int p[9];
  38. next1(s,p,9);
  39. for(int i=0;i<9;i++)
  40. {
  41. printf("%d\n",p[i]);
  42. }
  43. return 0;
  44. }

求next数组的两种方法的更多相关文章

  1. python将两个数组合并成一个数组的两种方法的代码

    内容过程中,把写内容过程中常用的内容收藏起来,下面的资料是关于python将两个数组合并成一个数组的两种方法的内容,希望能对小伙伴们有帮助. c1 = ["Red","G ...

  2. java script 数组去重两种方法

    第一种方法: var arr=[1,1,2,3,4,4,4,5,6,6,6,6];    var arrb=Array();    for(var i=0;i<arr.length;i++)   ...

  3. python遍历数组的两种方法

    第一种,最常用的,通过for in遍历数组 1 2 3 4 5 6 7 8 colours = ["red","green","blue"] ...

  4. [Arduino] 逗号分隔文本到数组的两种方法

    以下是今日练习通过逗号来分割字符数组/字符串的2个例子和方法" 1.通过indexOf函数 /* *Splitsplit sketch *split a comma-separated st ...

  5. nodejs 遍历数组的两种方法

    var array = [1,2,3]; array.forEach(function(v,i,a){ console.log(v); console.log(i); console.log(a); ...

  6. js数组创建两种方法

    一.数组直接量形式创建数组 var arr=[];//空数组 ,,,,,]; ,,,],{x:,y:}]; ; ,x+,x+]; console.log(arr3); //[1,3,3,4] ,,]; ...

  7. javascript遍历数组的两种方法

    var array=new Array(); array [0]="北京"; array [1]="天津"; ...//solution 1 for(var i ...

  8. PHP中数组合并的两种方法及区别介绍

    PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ...

  9. php获取数组中重复数据的两种方法

    分享下php获取数组中重复数据的两种方法. 1,利用php提供的函数,array_unique和array_diff_assoc来实现 <?php function FetchRepeatMem ...

随机推荐

  1. SpringBoot使用redis缓存List<Object>

    一.概述 最近在做性能优化,之前有一个业务是这样实现的: 1.温度报警后第三方通讯管理机直接把报警信息保存到数据库 2.我们在数据库中添加触发器,(BEFORE INSERT)根据这条报警信息处理业务 ...

  2. 无法使用备份文件 'D:\20160512.bak',因为原先格式化该文件时所用扇区大小为 512,而目前所在设备的扇区大小为 4096

    删除原先备份的记录 这里再加一条,如果你备份的文件还原有兼容性的问题,那就用低版本的sql做备份,这样的话哪里都能用

  3. 多目标遗传算法 ------ NSGA-II (部分源码解析)两个个体支配判断 dominance.c

    /* Domination checking routines */ # include <stdio.h> # include <stdlib.h> # include &l ...

  4. windows单机环境下配置tomcat集群

    场景:我们在平常联系中,需要涉及到tomcat中,但是电脑不够怎么办,肯定是在自己的电脑上模拟集群,就是装多个tomcat,这时候需要稍微配置下.如果是多个服务器,那不用配置,直接怼!!! 这里介绍的 ...

  5. IoC之Ninject

    一.Ninject安装 Ninject是一个轻量级的开源的DI容器,可以通过Nuget直接安装: 二.Ninject的简单使用 模型代码: //计算器接口 public interface ICalc ...

  6. readn.c

    #include <errno.h> #include <unistd.h> ssize_t readn(int fd, void *vptr, size_t n) { siz ...

  7. IDAPython安装

    转载:All Right   (本人没有测试过) 关于IDAPython的安装教程网上的资料非常少,也不是很详细,我费了好长时间才装好,现在和大家分享一下. 注意事项 下面几点关系到安装是否成功 ID ...

  8. pyqt5 添加属性-类方法用属性形式访问

    方法一 装饰器法 import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout,QLab ...

  9. luogu P3924 康娜的线段树

    题面传送门 我们可以画图找规律 这里没图,要看图可以去看M_sea dalao的题解(逃 可以发现单个节点\(i\)对答案的贡献为该节点的点权\(*\frac{1}{2^{dep_i}}\)(\(de ...

  10. sybench压测下模拟误truncate数据恢复

    基本环境:官方社区版MySQL 5.7.21 Row+Gtid开启sysbench压测,使用mysqldump备份数据库,执行truncate操作,恢复数据到truncate前的时间点1.切换日志,记 ...