今天在网上看到有一道算法题目:
求N个字符串中的最大公子串
http://www.iteye.com/topic/1118325
刚好闲着,做之。
先说一下思路:
1、从N个字符串中找出最小的字符串
2、分解出最小字符串最大公字符串列表:
例如:abcde
--------------------
abcde
abcd
bcde
abc
bcd
cde
ab
bc
cd
de
----------------------
3、分解出来的公子串从上到下去匹配其他的字符,都能匹配成功则是所要查找的最大公子串
4、如果同时存在两个相等长度的公子串 则以最先发现的为最大
说完上代码:
import java.nio.Buffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 求N个字符串中的最大公子串
*思路:
* 1、从N个字符串中找出最小的字符串
* 2、分解出最小字符串最大公字符串列表:
* 例如:abcde
* --------------------
* abcde
* abcd
* bcde
* abc
* bcd
* cde
* ab
* bc
* cd
* de
* ----------------------
* 3、分解出来的公子串从上到下去匹配其他的字符,都能匹配成功则是所要查找的最大公子串
* 4、如果同时存在两个相等长度的公子串 则以最先发现的为最大
*
*/
public class MaxPublicStr {
class Combination {
private CharBuffer a(char[] a, int[] tempNum, int m, int n, int startInd) {
for (int i = 0; i < n; i++) {
if (i >= startInd && i < (m + startInd)) {
tempNum[i] = 1;
} else {
tempNum[i] = 0;
}
}
return createResult(a, tempNum, m);
}
/**
* @param a:组合数组
* @param m:生成组合长度
* @return :所有连续的组合数组列表
*/
public List<CharBuffer> combinationsequence(char[] a, int m) {
List<CharBuffer> list = new ArrayList<CharBuffer>();
int n = a.length;
// 生成辅助数组。首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
int[] tempNum = new int[n];
for (int i = 0; i < tempNum.length; i++) {
if (i + m > n) {
break;
}
list.add(a(a, tempNum, m, n, i));
}
return list;
}
// 根据辅助数组和原始数组生成结果数组
@SuppressWarnings("unchecked")
public CharBuffer createResult(char[] a, int[] temp, int m) {
CharBuffer bos = CharBuffer.allocate(m);
for (int i = 0; i < a.length; i++) {
if (temp[i] == 1) {
bos.put(a[i]);
}
}
return bos;
}
}
public List<CharBuffer> combinationsequence(String str, int m) {
char[] a = str.toCharArray();
Combination c = new Combination();
List<CharBuffer> list = c.combinationsequence(a, m);
return list;
}
//字符串列表中的最短字符串
public String minStr(List<String> strings) {
return Collections.min(strings, new Comparator<String>() {
public int compare(String str1, String str2) {
if (str1.length() < str2.length())
return -1;
else if (str1.length() == str2.length())
return 0;
else if (str1.length() > str2.length())
return 1;
return 0;
}
});
}
//判断字符串列表中的每个字符串是否包含指定字符串,如果有一个不包含就返回false
public boolean contains(List<String> strings, String str) {
for (String s : strings) {
if (!s.contains(str))
return false;
}
return true;
}
public String maxSubString(List<String> strings) {
String shortStr = minStr(strings);
int i = shortStr.length();
//i是1 而不是0 因为当只有一个字符串的时候就没最大可言
while (i > 1) {
List<CharBuffer> list = combinationsequence(shortStr, i);
for (CharBuffer charBuffer : list) {
Buffer tempstr = charBuffer.rewind();
if (contains(strings, tempstr.toString())) {
return tempstr.toString();
}
}
i--;
}
return null;
}
public static void main(String[] args) {
MaxPublicStr max = new MaxPublicStr();
ArrayList<String> strings = new ArrayList<String>(Arrays.asList("ababcdghy", "abcdeftdsfgsdg", "abcdefsdf"));
String publicStr = max.maxSubString(strings);
System.out.println(publicStr);
}
}
分享到:
相关推荐
求N个字符串中的最大公子串(华为技能鉴定题) C语言版,可以参考
求N个字符串的最长公共子串,N,字符串长度不超过255。例如N=3,由键盘依次输入3个字符串为 Whatislocalbus? Namesomelocalbuses. loca1busisahighspeedI/Obusclosetotheprocessor. 则最长公共子串为“local...
根据给定的信息,本文将详细解释如何在SQL中实现截取用特定字符分割的字符串中的第n个子字符串。此需求通常应用于数据处理与分析场景中,尤其在处理半结构化或非结构化的文本数据时非常有用。 ### 核心知识点解析 ...
本主题将深入探讨如何使用C++语言来实现一个算法,该算法能够找出两个字符串中的最大公共子串。公共子串是指同时存在于两个或多个字符串中的任意非空字符序列。在本问题中,我们目标是找到最长的这样一个子串。 ...
根据给定的文件信息,我们可以总结出以下关于“求一个字符串中的连续出现次数最多的字串”的相关知识点: ### 一、问题定义与分析 #### 1.1 问题背景 在计算机科学中,字符串处理是常见且重要的任务之一。本问题是...
在计算机科学中,回文字符串是一个特殊的字符串,它正读反读都是一样的,比如"abcba"和"abccba"。本题目的重点在于如何编写C++代码来找到输入字符串中的最大回文子串及其长度。这个问题是字符串处理和算法设计的经典...
在C#中,处理字符串时,我们经常需要从一个较大的字符串中提取出特定部分,比如位于两个已知字符串之间的子串。这在解析日志、处理配置文件或者从HTML源码中提取信息时非常常见。标题中的“字符串提取(获取两个字符...
C语言程序设计-编写函数fun(str,i,n),从字符串str中删除第i个字符开始的连续n个字符(注意str[0]代表字符串的第一个字符);.c
创建一个新的VI,将“删除字符”和“字符串长度”这两个函数添加到程序框图中。连接字符串输入到这些函数,然后将它们的输出连接到适当的控件或指示器,以在前面板上显示结果。 5. **运行项目**: 描述中提到项目...
传入一个字符串和整数m,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串并打印出来。
【问题描述】编写函数itob(n,s,b),用于把整数n转换成以b为基的字符串并存储到s中. 编写程序,使用函数itob(n,s,b)将输入的整数n,转换成字符串s,将s输出.转换后的字符串从最高的非零位开始输出。如果n为负数,则输出的...
找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad" 主要用的是矩阵的思想
去掉重复的字符串及在第一个字符串中删除在第二个字符串中出现的字符两个程序,vs2013已经验证
在LabVIEW中处理字符串是一项常见的任务,尤其是将一个字符串拆分成多个子字符串,这通常涉及到字符串的分割操作。本篇将详细介绍如何在LabVIEW中实现“字符串拆分到数组”并支持中文字符。 一、字符串拆分的基本...
本主题关注的是如何查找一个字符串中出现重复次数最多的字符。这是一个典型的字符串处理问题,对于理解字符串操作和优化算法能力的提升非常有帮助。 首先,我们要明确问题的目标:给定一个字符串,找出其中出现频率...
C# 语言中提供了多种字符串函数,用于对字符串进行操作和处理。本文将对 C# 字符串函数大全进行详细的介绍,包括 Len、Trim、Ltrim、Rtrim、Mid、Left、Right、LCase、UCase、StrComp、InStr、Split 和 Replace 等...
在字符串处理中,我们需要判断字符串中的每个字符是否为数字字符。我们使用了if语句来判断字符是否在'0'到'9'之间,如果是则表示该字符为数字字符。 知识点3:数字转换 在本文档中,我们使用了减法操作来将字符...
java输出5个字符串中最长的字符串.
输入一个长度不超过100的字符串,求出这个字符串的长度(不能使用strlen())
int replacate char res int n char const str 产生n个重复的str 串或者字符 存入res ">几个字符串处理函数增强版 常用需求基本都能完成 已经编译成DLL 函数列表 兼容字符和串 void revstr char str 字符串反转 ...