求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 ...
随机推荐
- Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)
object func { def main(args:Array[String]):Unit={ //函数赋值给变量时, 必须在函数后面加上空格和下划线. def sayHello(name: St ...
- 为什么推荐InnoDB引擎使用自增主键?
索引使用时遇到的问题(顺丰)--InnoDB引擎不使用自增主键导致性能问题,也可答最左前缀 InnoDB自增主键 InnoDB主索引(同时也是数据文件)的示意图: 上文讨论过InnoDB的索引实现,I ...
- C# 实现Bezier曲线(vs2008)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- JAVA泛型中的类型擦除及为什么不支持泛型数组
一,数组的协变性(covariant array type)及集合的非协变性 设有Circle类和Square类继承自Shape类. 关于数组的协变性,看代码: public static doubl ...
- sql 行变列
select * from market//查看原来所有数据 //第一种方式 select max(case area when '南京' then num else 0 end) 南京, max(c ...
- Java SE之反射技术[Class](三)
/** * * @author Zen Johnny * */ package com.cpms.test; import java.lang.reflect.Field; import java.u ...
- swift学习第一天---常量变量基础数据类型
import Foundation /** * 1.常量 变量 知识要点:常量的定义用let 变量的定义用var 常量一旦定义便不可再更改. 变量定义之后可以在定义之后的程序中任意地方进行修改. */ ...
- Latex 公式居中
这么简单的功能要是还要加工具包,LaTeX也不用混了~ 公式用\[...\]来写可以达到公式居中效果. 或者在equation环境外加center环境: \begin{center} \begin{e ...
- Python3 isinstance() 函数
Python3 isinstance() 函数 描述 isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). isinstance() 与 type() 区别: typ ...
- Django配置富文本编辑器kindeditor
一.简介 django是一个容易快速上手的web框架,用它来创建内容驱动型的网站(比如独立博客)十分方便.遗憾的是,django并没有提供官方的富文本编辑器,而后者恰好是内容型网站后台管理中不可或缺的 ...