后缀数组 java实现_后缀数组模板 - java开发指南博客 【转载】 - ITeye博客
//后缀数组模板
int wa[maxn],wb[maxn],wv[maxn],ws[maxn];//这些都是需要用到的中间变量
int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void da(int *r,int *sa,int n,int m)
//这里的n应该是字符串长度 + 1,最后一位为追加的0,我的感觉这里主要是为了方便下面height的求解,如果sa[0]出现在字符中间,则需要进行一些判断,从而增加了代码复杂度
//r为所求数组,sa为后缀数组
{
int i,j,p,*x=wa,*y=wb,*t;
//x首先存储原数组,然后变为rank数组
//y对应排序好的第二关键字所在位置
for(i=0;i
for(i=0;i
for(i=1;i
for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;
for(j=1,p=1;p
{
//这两步对y进行处理,记录第二关键字所在位置,从小到大
for(p=0,i=n-j;i
for(i=0;i=j) y[p++]=sa[i]-j;//因为这里对应的是sa[],而sa[]中元素为有序已经排序好的,所以直接赋值即可
for(i=0;i
for(i=0;i
for(i=0;i
for(i=1;i
for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];//这里需要使用y[i]来赋值,y[]对应从小到大排序好第二关键字所在位置
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i
//上面的交换算法作用是将x数组所有元素赋值给y,如果直接y = x,则会使x,y指向同一地址
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;//将sa[]转变为rank,使用x[]来存储。p记录后缀字符串不同的个数,如果等于n则可以结束
}
return;
}
//求height[],后缀数组的使用
int rank[nMax], height[nMax];
int calHeight(int *r, int *sa, int n)//这里的n为实际字符串长度
{
int i, j, k;
for(i = 1; i < n; ++ i) rank[sa[i]] = i;//将sa[]转变为rank[]。这里从1开始即可,因为rank[sa[0]]始终为0
for(i = 0; i < n; height[rank[i ++]] = k;)//到不了n,也就是说取不到追加的0,这样就可以避免rank[]等于0的情况,从而方便下面rank[i] - 1的运算
//h[i] = height[rank[i]],h[i] >= h[i - 1] - 1。h[i]表示后缀数组suffix(i)与前面相邻后缀数组的最长公共字符串
for(k ? k -- : 0, j = sa[rank[i] - 1]; r[i + k] == r[j + k]; k ++);
}
分享到:
2012-08-11 16:29
浏览 713
评论
后缀数组 java实现_后缀数组模板 - java开发指南博客 【转载】 - ITeye博客相关推荐
- 视频教程-企业微信支付JAVA版_向员工收款-微信开发
企业微信支付JAVA版_向员工收款 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信息 ...
- yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组
本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...
- java8 从数组获取流_从数组到流再到Java 8
java8 从数组获取流 不久前,我们将一些Eclipse插件项目升级到Java8.此后再也没有回头. 除其他事项外,使用lambda和streams API ,过滤,映射和查找集合中的元素变得更加容 ...
- java数组查找文本_基于数组的二叉查找树 Binary Search Tree (Java实现)
二叉查找树 二叉查找树是一种支持动态查询的数据结构,所谓动态查寻结构:即在当数据集合内容发生改变时,集合内数据的排列组合不用重新构建.这样的数据结构在查询时需要不断变动的场景中是非常高效的,二叉查找树 ...
- java中对象数组如何构造_对象数组如何构造
定义一个对象数组时是如何调用构造函数和析构函数的 #include #include using namespace std; //对象数组的初始化请看该函数 class student { publ ...
- java错位_【LeetCode(Java) - 634】寻找数组的错位排列
[LeetCode(Java) - 634]寻找数组的错位排列 [LeetCode(Java) - 634]寻找数组的错位排列 文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解 ...
- php 检查数组为空_检查数组是否为空在PHP中
php 检查数组为空 Given an array and we have to check if array is an empty or not using PHP. 给定一个数组,我们必须检查数 ...
- android给数组添加新元素_「数组赋值」什么是数组、如何创建数组、数组赋值、数组增加一个新元素 - seo实验室...
数组赋值 一起组团(什么是数组) 我们知道变量用来存储数据,一个变量只能存储一个内容.假设你想存储10个人的姓名或者存储20个人的数学成绩,就需要10个或20个变量来存储,如果需要存储更多数据,那就会 ...
- python定义三维数组手机端_三维数组python
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我有一个三维数组temprsubset我取了两个维度的平均值. 代码:f=mfd ...
最新文章
- 计算机组成原理二进制地址码,计算机组成原理
- php中添加访问器,php – 结合访问器和mutator逻辑,为模型添加自定义属性
- 089-袁佳鹏-实验报告1
- 【模型解读】“全连接”的卷积网络,有什么好?
- 前端学习(3248):react的生命周期getSnapBeforeUpdate举例
- 前端学习(544):node的全局模块
- linux c语言 文件拷贝,怎么在linux下用c编程实现文件的复制
- Vue.js如何在一个页面调用另一个同级页面的方法
- sqlite3在Python2.7下对于中文路径的支持
- 宅男福利!20行Python代码,一网打尽B站小姐姐的直播信号源!
- 好学易懂 从零开始的插头DP(一)
- 个人简历模板怎么写?个人求职简历包含几个部分?
- 001.UG_NX概述
- 鲲鹏920的服务器芯片,鲲鹏920芯片是什么芯片
- 步步为营 SharePoint 开发学习笔记系列 二、安装和配置
- swift 函数类型+高阶函数
- repository ‘Gradle Libs‘ was added by unknown code
- 呼叫中心电话系统怎么搭建?能用到哪些智能应用?
- AE开发 遇到未能加载文件或程序集的问题 FileNotFoundException
- JVM 直接内存的使用与回收