求next数组的两种方法
法一解释:转自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数组的两种方法的更多相关文章
- python将两个数组合并成一个数组的两种方法的代码
内容过程中,把写内容过程中常用的内容收藏起来,下面的资料是关于python将两个数组合并成一个数组的两种方法的内容,希望能对小伙伴们有帮助. c1 = ["Red","G ...
- 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++) ...
- python遍历数组的两种方法
第一种,最常用的,通过for in遍历数组 1 2 3 4 5 6 7 8 colours = ["red","green","blue"] ...
- [Arduino] 逗号分隔文本到数组的两种方法
以下是今日练习通过逗号来分割字符数组/字符串的2个例子和方法" 1.通过indexOf函数 /* *Splitsplit sketch *split a comma-separated st ...
- nodejs 遍历数组的两种方法
var array = [1,2,3]; array.forEach(function(v,i,a){ console.log(v); console.log(i); console.log(a); ...
- js数组创建两种方法
一.数组直接量形式创建数组 var arr=[];//空数组 ,,,,,]; ,,,],{x:,y:}]; ; ,x+,x+]; console.log(arr3); //[1,3,3,4] ,,]; ...
- javascript遍历数组的两种方法
var array=new Array(); array [0]="北京"; array [1]="天津"; ...//solution 1 for(var i ...
- PHP中数组合并的两种方法及区别介绍
PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ...
- php获取数组中重复数据的两种方法
分享下php获取数组中重复数据的两种方法. 1,利用php提供的函数,array_unique和array_diff_assoc来实现 <?php function FetchRepeatMem ...
随机推荐
- nginx: [warn] duplicate MIME type "text/html"错误
检查配置文件时提示:nginx: [warn] duplicate MIME type "text/html" in /home/web/nginx/inc/gzip.conf:9 ...
- python---tornado钩子预留解析
在tornado.web.RequestHandler类中的初始构造方法中: class RequestHandler(object): """Base class fo ...
- 酷炫的SVG 动态图标
在 loading.io 上能看到好多效果惊艳的loading图标.它们都是用svg写成的,寥寥几 ...
- Cannot send, channel has already failed:
背景: 一个同事往这个队列发数据,另一个同事从这个队列取数据,进行解析. 这是昨天同事昨天消费者 消费activemq 队列,一开始有正常,运行了一段时间后,发现突然消费者变为零了.因为有监控.之后怎 ...
- 【转】LR分析法
转自:http://guanjy0129.blog.163.com/blog/static/1115494452010614113333509/ LR分析法的归约过程是规范推导的逆过程,所以LR分析过 ...
- Sql Server数据库资料收集
1.表分区 http://www.cnblogs.com/huangxincheng/p/3565755.html 2.MVP教程地址:http://www.cnblogs.com/lyhabc/p/ ...
- luogu P1081 开车旅行
传送门 这题的暴力做法显然是照题意模拟,从每个点出发暴力跳.而这个暴跳显然是可以倍增优化的,就是预处理出从每个点,(一开始是A)往后跳\(2^k\)步,能到哪里,以及\(A\)和\(B\)的路程,然后 ...
- luogu P3304 [SDOI2013]直径
树的直径两遍dfs救星了 至于一定在直径中的边数,可以发现这些边一定是连续的(不然你两条直径中间能有空挡?),然后,如果某个点往下有多条直径,那么这条点以下都不算入答案.所以以直径分别两端点为根,找出 ...
- idea的起步配置
工欲善其事,必先利其器 1.安装 https://www.jetbrains.com/idea/download/#section=windows 可以选择不同平台的安装包,版本一般Ultimate, ...
- linux 定期清除日志
clearLog.sh #!/bin/sh find /usr/local/apache/logs -mtime + 30 -name "*.log" -exec rm {} \; ...