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

关键运算步骤


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

法二:运用最大长度表

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int next[111111];
void next1(char s[],int next[],int n)
{
next[0]=0;
int len=0,i=1;//len表示前缀长度
while(i<n)
{
if(s[i]==s[len])//第i个等于第len个
{
len++;
next[i]=len;
i++;
}
else
{
if(len>0)
len=next[len-1];
else//也就是len=0的情况
{
next[i]=len;//0
i++;
}
}
}
for(int i=n;i>0;i--)//值右移一位
next[i]=next[i-1];
next[0]=-1;
}
int main()
{
char s[]="ABABCABAA";
int p[9];
next1(s,p,9);
for(int i=0;i<9;i++)
{
printf("%d\n",p[i]);
}
return 0;
}

求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. iframe伪造ajax

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 获取当前操作系统的ip

    代码如下: #include "stdafx.h" #include <WinSock2.h> int get_local_ip() { WSADATA wsaData ...

  3. Linux记录-shell一行代码杀死进程(收藏)

    ps -ef |grep hello |awk '{print $2}'|xargs kill -9

  4. hp电脑重装win7 64位 后 所有软件都装不上问题【转】

    hp 电脑重装后 所有软件都装不上问题 装了近100来次机,第一次遇到这样的. bug描述: 新笔记本刚装了纯净版的64位旗舰版win7,想装软件,就弹出已停止工作.比如装火狐浏览器,弹出火狐浏览器网 ...

  5. mysql创建数据库指定编码格式

    CREATE DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  6. OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename(转)

    自从OpenCV推出了Mat后越来越像是Matlab了,使用起来方便了很多,但是,在用at方法访问Mat时,如何选用合适的typename类型来访问相应的Mat元素是个头疼的问题. 比如: int H ...

  7. JavaScript之表格操作(二)创建表格病填充表格数据

    //创建表格 var tableOptions = { way: "insertBefore", //insertBefore,append positionId: "d ...

  8. 寻路优化(二)——二维地图上theta*算法的设计探索

    这篇文章是基于上一篇文章的研究上进行的,使得路径更加的平滑和自然,特此记录.有错误欢迎大家批评指正.如需转载请注明出处,http://www.cnblogs.com/Leonhard-/p/68660 ...

  9. python技巧 switch case语句

    不同于C语言和SHELL,python中没有switch case语句,关于为什么没有,官方的解释是这样的 使用Python模拟实现的方法: def switch_if(fun, x, y):    ...

  10. python队列queue 之优先级队列

    import queue as Q def PriorityQueue_int(): que = Q.PriorityQueue() que.put(10) que.put(1) que.put(5) ...