`

java-两种方法求第一个最长的可重复子串

阅读更多
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class MaxPrefix {

	
	public static void main(String[] args) {
		String str="abbdabcdabcx";
		//String str="ababa";
		MaxPrefix mp=new MaxPrefix();
		mp.findMaxPrefix2(str);
	}
	
	/*
	 * 1.find a[j]=a[i].(i<j)
	 * 2.k=i.(k++,j++)until a[k]!=a[j].count the length;if count>prefixLen,prefixLen=count. update the startIndex.
	 * 3.next i
	 */
	public void findMaxPrefix(String str){
		char[] chars=str.toCharArray();
		int len=str.length();
		int startIndex=0;
		int prefixLen=0;
		boolean found=false;
		for(int i=0;i<len;i++){
			int j=i+1;
			for(;j<len;j++){
				if(chars[j]==chars[i]){
					found=true;
					break;
				}
			}
			if(found){
				int count=0;
				int k=i;
				while(k<len&&j<len&&chars[k]==chars[j]){
					k++;
					j++;
					count++;
				}
				if(count>prefixLen){
					startIndex=k-count;
					prefixLen=count;
				}
			}
		}
		if(prefixLen!=0){
			System.out.println(prefixLen+",startIndex="+startIndex);
			for(int i=0;i<prefixLen;i++){
				System.out.print(chars[startIndex+i]);
			}
		}else{
			System.out.println("no duplicate char ");
		}
	}
	
	/*
	 * 使用后缀数组,具体思路参见http://blog.csdn.net/iamskying/article/details/4759485
	 * 不过
	 * 1.这个思路在生成后缀数组时,用“暴力”生成:先取最后1个元素,然后取最后2个元素、最后3个元素...
	 * 据说可以通过倍增算法和DC3算法,不过没研究过...
	 * 2.下面这个结论我不明白,后缀数组的原理还没研究过-->
	 * “将所有后缀数组按字典顺序排序后,两个相邻位置的后缀数组比较,取其最长公共前缀,即为所求字符串s的最长可重叠重复子串”
	 */
	public void findMaxPrefix2(String str){
		String[] suffixArray=generateSuffixArray(str);
		//string sort
		List<String> list = (List<String>) Arrays.asList(suffixArray);
		Collections.sort(list);
		
		//两个相邻位置的后缀数组比较,取其最长公共前缀
		//int startIndex=0;//只有第一个字符相同时,才有“公共前缀”
		int prefixLen=-1;
		int index=-1;
		for(int i=0,len=suffixArray.length;i<len-1;i++){
			char[] str1=suffixArray[i].toCharArray();
			char[] str2=suffixArray[i+1].toCharArray();
			int k1=0,k2=0;
			int len1=str1.length,len2=str2.length;
			int count=0;
			if(str1[0]==str2[0]){//只有第一个字符相同时,才有“公共前缀”
				while(k1<len1&&k2<len2&&str1[k1]==str2[k2]){
					k1++;
					k2++;
					count++;
				}
				if(count>prefixLen){
					prefixLen=count;
					index=i;
				}
			}
		}
		if(index!=-1){
			String str3=suffixArray[index];
			System.out.println("max SubString is "+str3.substring(0,prefixLen));
		}else{
			System.out.println("no duplicate char ");
		}
		
	}
	public String[] generateSuffixArray(String str){
		int len=str.length();
		String[] suffixArray=new String[len];
		for(int i=0;i<len;i++){
			int endIndex=len;
			int beginIndex=len-1-i;
			suffixArray[i]=str.substring(beginIndex, endIndex);
		}
		return suffixArray;
	}
}

0
1
分享到:
评论
2 楼 无知的1234 2015-05-12  
第一个方法有错吧,如果在碰见一个字母相同后,后面相同的字母则不会再去比较了诶
1 楼 shenselongge 2014-04-03  
用abbdabcdabcxddddddeeeddd测试结果不正确

相关推荐

    使用Java实现的计算两字符串相似度+最长公共子序列.zip

    在计算机科学领域,字符串处理是常见的一类任务,其中计算两个字符串的相似度以及找到它们的最长公共子序列(Longest Common Subsequence, LCS)是一个经典的问题。本篇将深入探讨这个问题,以及如何使用Java来解决...

    最长递增子序列多种实现(java)

    这个Java实现提供了两种解决最长递增子序列问题的方法:基本动态规划和动态规划结合二分查找。动态规划是解决问题的基础,而二分查找的引入是为了提升算法效率。在实际应用中,根据数据规模和性能需求,可以选择合适...

    最长公共子序列(java实现)

    1. 初始化:设置dp数组的第一行和第一列均为0,因为一个序列的最长公共子序列长度是它自身的长度,即当只有一个字符时,其LCS长度为1。 2. 遍历:对于dp数组中的每个元素,如果X的第i个字符和Y的第j个字符相同,则dp...

    java求字符串的正向反向最大公共字符串

    总结来说,解决"java求字符串的正向反向最大公共字符串"这个问题,我们可以采用动态规划方法,通过对字符串的遍历和比较,找出并返回最长的公共子串。这种技术在处理字符串匹配、编辑距离等问题时非常常见,有助于...

    字符串最长回文实现

    `main`函数中给出了一个测试用例`"babad"`,输出结果应为`"bab"`或`"aba"`,具体取决于算法找到的第一个最长回文子串。 此外,还可以使用Manacher's Algorithm来更高效地解决这个问题。Manacher's Algorithm利用了...

    基于Java+动态规划算法解决最长公共子序列问题.zip

    在两个或多个字符串中找到一个最长的子序列,这个子序列不必连续,但必须保持原顺序。例如,字符串 "ABCDGH" 和 "AEDFHR" 的最长公共子序列是 "ADH"。 Java作为一种广泛使用的编程语言,具有丰富的库和强大的性能,...

    java-lintcode阶梯训练第四章

    7. **字符串处理**:字符串匹配、模式查找、最长重复子串等问题在Java编程中也很常见,需要掌握KMP算法、Rabin-Karp算法等。 8. **哈希表与映射**:哈希表的高效查找和映射特性在解决许多问题时能发挥重要作用,...

    LcsLength.rar_最长 公共子序列 算法_最长公共子序列

    最长公共子序列(Longest Common Subsequence,LCS)算法是一种经典的计算机科学问题,主要应用于比较和分析两个或多个序列的相似性。在本实验作业中,我们将关注两个字符串之间的LCS,这是一个基础且重要的算法,它...

    最长公共子序列

    在这个问题中,我们有两个字符串,目标是找到这两个字符串中最长的子序列,这个子序列不必连续,但必须保持原顺序。在本示例中,我们将探讨如何使用动态规划来解决这个问题,特别是使用Java编程语言。 首先,我们...

    java-leetcode面试题解双指针之第658题找到k个最接近的元素.zip

    2. 初始化两个指针left和right,left指向数组的第一个元素,right指向数组的最后一个元素。 3. 计算目标值target与left和right所指元素的差值,取差值较小的一边作为候选答案。 4. 初始化一个大小为k的结果数组res[]...

    java20道非常经典的编程题

    - 找出一个字符串中最长的回文子串,Manacher's algorithm 是一种高效的解决方案。 16. **二分查找**: - 在有序数组中使用二分查找法寻找特定值,理解其基本原理和边界条件处理。 17. **字符串匹配**: - 实现...

    0/1背包问题 动态规划 Java代码实现

    2. 遍历所有物品,对于每个物品`i`,考虑两种情况: - 不选该物品:`dp[i][j] = dp[i-1][j]` - 选该物品:如果物品`i`的重量小于或等于`j`,则可以选择它,此时最大价值可能是`dp[i-1][j] + item[i].value`(不...

    最长公共自序列的程序实现(含源码,可直接运行)

    最长公共自序列(Longest Common Self-Prefix, LCS)是一种字符串处理问题,它寻找两个或多个字符串中的最长的公共前缀。在这个特定的程序实现中,我们关注的是Java语言下的LCS算法。LCS问题在计算机科学中广泛应用...

    java高级工程师面试总结

    - Spring支持声明式事务管理和编程式事务管理两种方式。 - 声明式事务管理通过配置文件或注解来定义事务边界。 - 编程式事务管理通过编程的方式手动控制事务的开启、提交和回滚。 - **Hibernate与MyBatis的比较*...

    动态规划最多任务工资java-五大常用算法之二:动态规划算法,算法数据结构

    动态规划算法的基本框架代码示例中,有两个嵌套循环,第一个循环遍历阶段(例如,工作任务),第二个循环更新每个阶段的状态。`f(i)`表示与阶段`i`相关的表达式,`xi[j]`表示在阶段`i`时选择任务`j`的状态。`g()`...

    Common Subsequence 动态规划 java(csdn)————程序.pdf

    数组的第一行和第一列分别初始化为0,因为没有一个字符的公共子序列长度为0。 接下来的双层循环遍历字符串`a`和`b`的所有字符。对于每个字符对`(a[i-1], b[j-1])`,我们有两种情况: 1. 如果`a[i-1]`等于`b[j-1]`...

    深入研究算法的Java实现和技术面试常见问题示例 - Java, Python - 下载.zip

    - 动态规划是一种解决最优化问题的方法,通过将问题分解为子问题并存储中间结果来避免重复计算,如背包问题、最长公共子序列、斐波那契数列等。 4. **图论算法**: - 深度优先搜索(DFS)和广度优先搜索(BFS):...

Global site tag (gtag.js) - Google Analytics