博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长的重复子序列 后缀数组 java实现
阅读量:5987 次
发布时间:2019-06-20

本文共 1639 字,大约阅读时间需要 5 分钟。

hot3.png

问题描述

给定一个字符串,求出其最长重复子串
例如:abcdabcd
最长重复子串是 abcd,最长重复子串可以重叠
例如:abcdabcda,这时最长重复子串是 abcda,中间的 a 是被重叠的。
后缀数组是一种数据结构,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。

abcbcab

0.abcbcab

1.bcbcab

2.cbcab

3.bcab

4.cab

5.ab

6.b

分成后缀数组

排序:(根据字典排序)

0.ab

1.abcbcab

2.b

3.bcab

4.bcbcab

5.cab

6.cbcab 

然后两两比较找出相同字符的长度

本例为: i(后缀数组下标)         temp(最大的相同数量,根据此数量截取)

            0(0-1数组比较以此类推)    2

            1                                  0

            2                                  1

            3                                  2

            4                                  0

            5(5-6数组比较)               1

import java.util.ArrayList;import java.util.List;import java.util.Set;import java.util.TreeSet;public class PostfixArray {	public static void main(String[] args){		String s = "abcbcab";		System.out.println(maxLength(s));	}		public static List
maxLength(String s){ Set
postfix = new TreeSet
();//存储后缀数组,并排序 for(int i = 0; i < s.length(); i++){ postfix.add(s.substring(i)); } List
postfixList = new ArrayList
(postfix);//set转换成list方便调用 int temp = 0;//最长的重复子序列截取位置 for(int i = 0; i < postfixList.size() - 1; i++){//循环,找出最长的重复子序列下标,最长的重复子序列截取位置 int len = maxlength(postfixList.get(i), postfixList.get(i + 1));//获取后缀数组两两比较的相同子序列长度 if(len >= temp){ temp = len; maxis = i; } } List
results = new ArrayList
(); results.add(postfixList.get(maxis).substring(0, temp));//根据最长的重复子序列下标和截取位置,获得最长的重复子序列 return results; } private static int maxlength(String next, String next2) { char[] c1 = next.toCharArray(); char[] c2 = next2.toCharArray(); int maxlen = 0; for(int i = 0; i < (c1.length > c2.length ? c2.length : c1.length); i++){ if(c1[i] == c2[i]){ maxlen++; } } return maxlen; }}

转载于:https://my.oschina.net/fangshaowei/blog/176035

你可能感兴趣的文章
拍照之外, 游戏手机会成为手机新品类吗?
查看>>
Lync 小技巧-1-解决搜索不到联系人的方法
查看>>
数据仓库入门(实验6)添加层次结构
查看>>
第一次获得Microsoft MVP应该做的事
查看>>
用OSSIM发现网络扫描
查看>>
IT群侠传第四回大鱼小虾
查看>>
10分钟搭建Kubernetes容器集群平台(kubeadm)
查看>>
我的家庭私有云计划-18
查看>>
当我们谈论知识管理时,我们在谈论什么?
查看>>
我是这样看搜狗搜索与知乎合作的
查看>>
演示:为思科29系列的交换机升级IOS镜像
查看>>
统一沟通-技巧-4-让国内域名提供商“提供”SRV记录
查看>>
一次DPM备份Exchange DAG的故障处理过程
查看>>
Windows Server 2012 NIC Teaming配置实战
查看>>
KingbaseES的HA搭建
查看>>
思科加强生成树性能的属性(Portfast /Uplinkfast/BackboneFast)与RSTP的关系
查看>>
lvm的使用总结
查看>>
【马哥教育视频】Linux平台软件包管理系列视频
查看>>
DPM2012系列之五:开启最终用户恢复功能
查看>>
使用JFinal/Jsmart框架开发体验(一)
查看>>